Wie schlie�e ich einen per accept erhaltenen Descriptor auf eine Socket?
Ich habe das Problem, das ein Service das auf Solaris lief auf Linux
umgestellt wird und sich perl hier leider anders verh�lt.
Unter Solaris wird die Verbindung umgehend geschlossen, sobald sie
ausser scope geht.
Unter Linux bleibt sie aber offen wodurch der Client h�ngen bleibt.
while (($paddr = accept(CLIENT, SERVER)) || !$time_to_die) {
if (isToProcess()) {
spawn (sub { communicate($ip, $port); });
} else {
// $paddr schlie�en/beenden
}
}
Mein Problem ist, dass das Gegenst�ck h�ngen bleibt wenn die Verbindung
nicht angenommen wird.
close funktioniert leider nicht.
Ach ja:
perl -version
This is perl, v5.8.5 built for x86_64-linux-thread-multi
Danke f�r alle Vorschl�ge!
Schau Dir mal <http://www.tutorialspoint.com/perl/perl_socket.htm> an
und dort den Abschnitt "Script to Create a Server" (fᅵr einen Client
steht dort auch ein Beispiel).
> Mein Problem ist, dass das Gegenstᅵck hᅵngen bleibt wenn die
> Verbindung nicht angenommen wird.
Mᅵglicherweise hast Du ein ganz anderes Problem. Es wird immer nur
eine Verbindung angenommen, die anderen mᅵssen bis zum nᅵchsten accept
warten. Die Anzahl der maximal Wartenden hᅵngt glaube ich vom Backlog
ab (siehe listen()).
Beim Tod des Servers kann es auᅵerdem passieren, daᅵ die Verbindung
nicht gleich abgebaut wird und ein Neustart des Servers eine Zeitlang
nicht geht. Dagegen hilft dann ein setsockopt SO_REUSEADDR (ist in dem
Beispiel enthalten).
Gruᅵ
Guido
Ja, danke!, dass hat mir weitergeholfen. Ich dachte, ich muss $paddr
schlieᅵen. Dabei ist es close(CLIENT) (siehe Codebeispiel vorher)
>> Mein Problem ist, dass das Gegenstᅵck hᅵngen bleibt wenn die
>> Verbindung nicht angenommen wird.
>
> Mᅵglicherweise hast Du ein ganz anderes Problem. Es wird immer nur
> eine Verbindung angenommen, die anderen mᅵssen bis zum nᅵchsten accept
> warten. Die Anzahl der maximal Wartenden hᅵngt glaube ich vom Backlog
> ab (siehe listen()).
Nein, es war schon das. Das Problem ist, dass der Client auf eine
Antwort wartet, die nie kommen wird, weil der Server unter gewissen
Bedingungen die Verbindung verwirft.
Danke!
Christoph