Mailinglist Archive: opensuse-de (1203 mails)

< Previous Next >
Frage an Netzwerkprogrammierer (TCP connect timeout)
  • From: Torsten Foertsch <torsten.foertsch@xxxxxxx>
  • Date: Thu, 25 Sep 2008 13:24:58 +0200
  • Message-id: <200809251324.58167.torsten.foertsch@xxxxxxx>
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@xxxxxxxxxxxx
Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken
Sie eine Mail an: opensuse-de+help@xxxxxxxxxxxx

< Previous Next >
Follow Ups