Am Donnerstag, 27. Dezember 2007 schrieb Andre Tann:
ich möchte gerne in einem Skript einen zufälligen Port auswählen, sagen wir zwischen 20000 und 40000, gucken ob er frei ist, und ihn dann im weiteren Skriptverlauf verwenden.
Bist du dir sicher, daß du den ganzen Port-Kram (aka TCP) verstanden hast? :-D
Hat jemand einen Tip, wie man rauskriegt, ob ein Port frei ist?
Ganz einfach: man versucht sich daran zu binden, siehe "man 2 bind". Wenn der Port schon benutzt wird, dann bekommt man einen Fehler zurück geliefert: #!/usr/bin/perl -w use strict; use Socket; my $port = shift; my $protocol = getprotobyname('tcp'); socket(SOCKET, PF_INET, SOCK_STREAM, $protocol) or die "Can't open socket$!\n"; setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1) or die "Can't set socket option to SO_REUSEADDR$!\n"; bind( SOCKET, sockaddr_in($port, INADDR_ANY)) or die "Can't bind to port $port! \n";
(...). Oder gibts irgendein fertiges Tool, welches mir einen freien Port liefert (ähnlich wie mktemp einen benutzbaren Dateinamen liefert)?
Das wird schwierig. AFAIK ist ein Port einem Prozeß zugeordnet. Sobald das fertige Tool dir eine freie Adresse zurückliefert, muß die schon lang nicht mehr frei sein, da der Tool-Prozeß wieder freigibt. Tut er das nicht, dann kannst du sie auch nicht verwenden, weil eben der Tool-Prozeß sie hat. Darüberhinaus ist IIRC ein Port auch noch für eine gewisse Zeit blockiert, aber das kann man mit SO_REUSEADDR umgehen. Gruß Jan -- The first rule of intelligent tinkering is to save all the parts. -- 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