Filedescriptor von accept schließen

02/12/2009 - 19:32 von Christoph Rabel | Report spam
Hi!

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!
 

Lesen sie die antworten

#1 Guido Ostkamp
02/12/2009 - 21:05 | Warnen spam
Christoph Rabel wrote:
Wie schließe ich einen per accept erhaltenen Descriptor auf eine Socket?



Schau Dir mal <http://www.tutorialspoint.com/perl/...et.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

Ähnliche fragen