Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Filedescriptor von accept schließen

0 views
Skip to first unread message

Christoph Rabel

unread,
Dec 2, 2009, 1:32:21 PM12/2/09
to
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!

Guido Ostkamp

unread,
Dec 2, 2009, 3:05:37 PM12/2/09
to
Christoph Rabel <christo...@gmail.com> wrote:
> Wie schlieᅵe ich einen per accept erhaltenen Descriptor auf eine Socket?

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

Christoph Rabel

unread,
Dec 2, 2009, 4:10:03 PM12/2/09
to
On 02.12.2009 21:05, Guido Ostkamp wrote:
> Christoph Rabel<christo...@gmail.com> wrote:
>> Wie schlieᅵe ich einen per accept erhaltenen Descriptor auf eine Socket?
>
> 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).

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

0 new messages