Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8022[/thread]

Perl SMTP-Server: fork funktioniert nicht



<< >> 2 Einträge, 1 Seite
Wlet
 2006-05-26 17:16
#66639 #66639
User since
2006-05-24
15 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich will mittels Net::SMTP::Server einen kleinen Perl SMTP-Server schreiben.
In der Doku dazu heißt es:
Quote

# Handle the client's connection and spawn off a new parser.
# This can/should be a fork() or a new thread,
# but for simplicity...


Also hab ich mich daran gemacht, den Prozess zu forken. leider funktioniert das nicht wie gewünscht ;(. Leider kann ich den Fehler nicht finden. Vielleicht kann mir jemand von euch sagen, was ich falsch mache:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use strict;
use warnings;
use Carp;
use Net::SMTP::Server;
use Net::SMTP::Server::Client;
use Net::SMTP;
use File::Log;
use Config::General;
use Init;

$Net::SMTP::Server::server = new Net::SMTP::Server($Init::config{ip}, $Init::config{port}) || croak(getTime()." Unable to create Mailer deamon for host $Init::config{ip} at Port $Init::config{port}: ".$!."\n");

while(my $conn = $Net::SMTP::Server::server->accept())
{
if (!defined(my $kidpid = fork()))
{
die "Cannot fork: $!";
} elsif ($kidpid == 0)
{
# fork returned 0, so this branch is child
my $client;
$Net::SMTP::Server::Client::client = new Net::SMTP::Server::Client($conn) ||
croak(getTime()." Unable to handle client connection: $!\n");
$Net::SMTP::Server::Client::client->process;
my $from = $client->{FROM};
my $to = $client->{TO}[0];
my $msg = $client->{MSG};
exit(0);
} else
{
# fork returned 0 nor undef
# so this branch is parent
waitpid($kidpid, 0);
$Init::log->close();
}
}

In Init:: werden nur die Config-Variablen gesetzt, und das Logging initialisiert.

Das Problem ist folgendes: Er nimmt den ersten Client an, und beginnt den SMTP-Dialog.
Die zweite Verbindung nimmt er an, startet aber den SMTP-Dialog nicht.
Bringe ich den ersten SMTP-Dialog zu ende (quit), beginnt die andere Session mit dem SMTP-Dialog. Es passiert also genau das, was ich mit dem Fork verhindern möchte.

Need Help!

Wlet

Edit: strict code ;)\n\n

<!--EDIT|Wlet|1148650897-->
Wlet
 2006-05-26 17:54
#66640 #66640
User since
2006-05-24
15 Artikel
BenutzerIn
[default_avatar]
Ich habs jetzt.

der letzte else-Zweig muss natürlich raus. Dort warte ich ja mit dem fortsetzen, bis das Child fertig ist...

Da schaut man Stunden auf seinen Code, und sieht diesen einfachen Denkfehler nicht *indenHinterntret*

Wlet
<< >> 2 Einträge, 1 Seite



View all threads created 2006-05-26 17:16.