listen () ohne Aufruf bind ()

8

Ich habe Folgendes versucht:

%Vor%

Keiner der Aufrufe ist fehlgeschlagen und das Programm hat gerade angefangen zu blockieren, als ob ich bind () aufgerufen hätte. Was wird in diesem Fall passieren? Wird es unmöglich sein, jemals eine Verbindung zu erhalten, da sie keine lokale Adresse oder keinen Port hat? Oder wurde ihm implizit eine lokale Adresse und ein Port zugewiesen, und jetzt hört er auf diese? Wenn ja, wie kann ich herausfinden, was diese sind?

    
Claudiu 12.04.2009, 00:35
quelle

3 Antworten

10

Die Aufrufe funktionieren, aber da Sie den Socket nicht explizit gebunden haben, hat das Betriebssystem oder die Systembibliothek Ihnen implizit einen Port und eine Standardbindung zugewiesen (genau wie beim Aufruf von connect(2) ohne Aufruf von bind(2) zuerst). Da Sie früher nach dem TCP-Material gefragt haben, nehme ich an, dass Sie hier über Internet-Sockets sprechen.

Wenn Sie herausfinden, an welchen Namen das Betriebssystem den Socket bindet, variiert es zwischen den Betriebssystemen. Daher müssen Sie nach Ihrem spezifischen Betriebssystem suchen. Die meisten Betriebssysteme bieten jedoch ein netstat oder ähnliches Tool, mit dem Sie abfragen können abhorchen welche Ports.,

Wie John in einem Kommentar erwähnt, können Sie getsockname(2) verwenden, um den Namen eines gebundenen Sockets zu finden. Hier ist ein kurzes Beispiel:

%Vor%

addr enthält jetzt die IP-Adresse und den Port, den Ihr Socket überwacht.

    
Jason Coco 12.04.2009, 00:51
quelle
2

Wie bereits erwähnt, wird das Betriebssystem einen Port zuweisen, wenn Sie nicht bind () haben. Sie können den Aufruf getsockname () nach listen () verwenden, um zu sehen, welche Adresse / Port zugewiesen sind. Wenn Sie dann diese Adresse / Port einem Client mitgeteilt haben, könnte es sich verbinden.

Es macht also Sinn, dass das funktioniert. Du könntest ein Programm schreiben, wo dies eine interessante Sache war.

    
John M 12.04.2009 14:37
quelle
0

Ich vermute, du wirst nie eine Verbindung bekommen. Sie können prüfen, ob ein neuer Socket abhörbereit ist, indem Sie vor und nach dem Ausführen des Programms das Äquivalent zu "netstat -an" auf Ihrem Betriebssystem ausführen.

Ich habe das gleiche in C # versucht:

%Vor%

Ich bekomme in der zweiten Zeile eine Ausnahme, die mich auf Umwegen darauf hinweist, dass eine Bindung erforderlich ist. Es funktioniert natürlich gut mit:

%Vor%

Ich habe auch mit einem Udp-Socket getestet und das gleiche ist, Windows ist nicht glücklich mit dem Listen-Aufruf, es sei denn, eine Bindung wurde gemacht. Da die .Net-Socket-Aufrufe lediglich Wrapper um Winsock sind, ist dieses Verhalten wahrscheinlich für alle von Winsock abgeleiteten Bibliotheken unter Windows identisch.

    
sipwiz 12.04.2009 00:50
quelle