Frage an Netzwerkprogrammierer (TCP connect timeout)
![](https://seccdn.libravatar.org/avatar/cade75bc5a38eae7b8d86692a7433a68.jpg?s=120&d=mm&r=g)
Hallo, wenn ich im LAN einen TCP Connect zu einem Rechner versuche, den es nicht gibt, z.B: $ perl -MSocket -MTime::HiRes=time -le ' my $t=time; socket my $s, PF_INET, SOCK_STREAM, getprotobyname("tcp") or die "socket: $!"; connect $s, scalar sockaddr_in(68, inet_aton("192.168.9.30")) or warn "connect: $!"; print time-$t' connect: No route to host at -e line 1. 3.00505399703979 dann kriege ich einen Timeout nach ziemlich genau 3 Sekunden. Probiere ich das im Internet ist der Timeout wesentlich länger, 188.99 Sekunden. Gibt es irgendeinen Socket Option oder sowas, die ich vor dem connect() setzen kann, um den Timeout zu setzen? Ich möchte das möglichst millisekundengenau. Geht das? Ich habe von SO_RCVTIMEO und SO_SNDTIMEO gelesen und letzteres scheint es zu sein, obwohl in der Beschreibung nur was von sendmsg(2) und send(2) steht: perl -MSocket -MTime::HiRes=time -le ' my $t=time; socket my $s, PF_INET, SOCK_STREAM, getprotobyname("tcp") or die "socket: $!"; setsockopt $s, SOL_SOCKET, SO_SNDTIMEO, pack("q2", 0, 500000) or die "setsockopt(SNDTIMEO): $!"; connect $s, scalar sockaddr_in(68, inet_aton("81.200.194.40")) or warn "connect: $!";print time-$t' connect: Operation now in progress at -e line 1. 0.499557018280029 Ist das die richtige Vorgehensweise? Oder gibt es einen besseren Weg, das Ganze zu erreichen (non-blocking connect möchte ich nicht)? Danke, Torsten -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
![](https://seccdn.libravatar.org/avatar/86a8a8ae8dd18e051b5799521cf40f3f.jpg?s=120&d=mm&r=g)
moin moin, Am Donnerstag, 25. September 2008 13:24 schrieb Torsten Foertsch: [...]
Ist das die richtige Vorgehensweise? Oder gibt es einen besseren Weg, das Ganze zu erreichen (non-blocking connect möchte ich nicht)?
Besser weiss nicht, aber anders:-) ping -c 3 -W 1 128.0.0.1 -W == timeout -c == anzahl ping man ping Das jedenfalls benutze ich, wenn ich die Erreichbarkeit einer IP Liste prüfen möchte... Es gibt hier auch diverse ping module: http://search.cpan.org/search?query=ping&mode=all Ob man nun eine TCP Client schreiben muss, ist wohl eher eine Frage der Zeit:) HTH andre -- Bureaucrat, n.: A person who cuts red tape sideways. -- J. McCabe -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
![](https://seccdn.libravatar.org/avatar/cade75bc5a38eae7b8d86692a7433a68.jpg?s=120&d=mm&r=g)
On Thu 25 Sep 2008, Andre Heine wrote:
Das jedenfalls benutze ich, wenn ich die Erreichbarkeit einer IP Liste prüfen möchte...
Ich möchte keine Test schreiben. Ich möchte eine TCP Verbindung aufbauen, um damit zu arbeiten. In dem konkreten Problem habe ich eine Liste von Paaren (IP Adresse, Port), die alle mehr oder weniger gleichwertig sind, also alle den benötigten Service liefern. Nun picke ich eine davon zufällig heraus und versuche connect(). Wenn das klappt, benutze ich die Verbindung. Wenn nicht, sollte der Fehler relativ zügig kommen, nicht erst nach 3 Minuten. Aber gut, ich renne mit der Socket Option wahrscheinlich in Portabilitätsprobleme. Einige Sekunden nachdem ich die ursprüngliche Mail schickte las ich in "UNIX Network Programming": neither socket option can be used to set a timeout for a connect. Unter Linux geht es zwar, aber in anderen Fällen wohl eher nicht. Torsten -- Need professional mod_perl support? Just hire me: torsten.foertsch@gmx.net -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
![](https://seccdn.libravatar.org/avatar/86a8a8ae8dd18e051b5799521cf40f3f.jpg?s=120&d=mm&r=g)
Am Donnerstag, 25. September 2008 13:54 schrieb Torsten Foertsch:
On Thu 25 Sep 2008, Andre Heine wrote:
Das jedenfalls benutze ich, wenn ich die Erreichbarkeit einer IP Liste prüfen möchte...
Ich möchte keine Test schreiben. Ich möchte eine TCP Verbindung aufbauen, um damit zu arbeiten. In dem konkreten Problem habe ich eine Liste von Paaren (IP Adresse, Port), die alle mehr oder weniger gleichwertig sind, also alle den benötigten Service liefern. Nun picke ich eine davon zufällig heraus und versuche connect(). Wenn das klappt, benutze ich die Verbindung. Wenn nicht, sollte der Fehler relativ zügig kommen, nicht erst nach 3 Minuten.
ACK, nun ist klar was du willst... Guck' mal hier: "http://www.perlmonks.org/?node_id=646831" Vielleicht hilft das weiter... perldoc IO::Socket::INET Ciao Andre
Aber gut, ich renne mit der Socket Option wahrscheinlich in Portabilitätsprobleme. Einige Sekunden nachdem ich die ursprüngliche Mail schickte las ich in "UNIX Network Programming": neither socket option can be used to set a timeout for a connect. Unter Linux geht es zwar, aber in anderen Fällen wohl eher nicht.
Wie das perl auf z.B. M$ macht. Keine Ahnung... Ciao andre -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
![](https://seccdn.libravatar.org/avatar/86a8a8ae8dd18e051b5799521cf40f3f.jpg?s=120&d=mm&r=g)
Moin, ich nochmal... Am Donnerstag, 25. September 2008 15:21 schrieb Andre Heine: [...]
Vielleicht hilft das weiter...
perldoc IO::Socket::INET
Unter Linux funktioniert das mit dem Timeout jedenfalls. #!/usr/bin/env perl use IO::Socket; use IO::Socket::INET; use strict; my $socket = new IO::Socket::INET ( PeerAddr => '128.0.0.1', PeerPort => 25, Timeout => 50, Type => SOCK_STREAM, ); die "Unable to open connection: $!\n" unless defined $socket; Ciao andre -- All other things being equal, a bald man cannot be elected President of the United States. -- Vic Gold -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (2)
-
Andre Heine
-
Torsten Foertsch