Er weist die Portnummer des "lokalen" Endes zu.
Für einen Server-Socket ist dies der ultimative Weg - es ist genau das, was benötigt wird: Haben Sie Ihren Socket zum Beispiel an Port 80 für einen Webserver gebunden.
Für einen Client-Socket ist die lokale Adresse und der Port normalerweise nicht von Bedeutung. Sie tun also nicht bind()
. Wenn der Server seine Clients auf eine bestimmte Portnummer oder eine Portnummer außerhalb eines bestimmten Bereichs beschränkt, können Sie auch bind()
auf der Clientseite verwenden.
Auf der anderen Seite, Sie könnten auch listen()
auf einem Sockel, wo Sie nicht bind()
aufgerufen haben (eigentlich bin ich mir nicht sicher, aber es wäre sinnvoll). In diesem Szenario wäre der Serverport zufällig und der Serverprozess würde seinen Port über ein anderes Mittel dem Client mitteilen. Stellen Sie sich ein "Double-Connection" -Protokoll wie FTP vor, wo Sie eine Kontrollverbindung und eine Datenverbindung haben. Der Port, den die Datenverbindung überwacht, ist völlig willkürlich, muss aber auf der anderen Seite kommuniziert werden. Also wird der "automatisch bestimmte Port" verwendet und kommuniziert.
Ein Beispiel in Python:
import socket
s = socket.socket() # create your socket
s.listen(10) # call listen without bind
s.getsockname() Which random port number did we get?
# here results in ('0.0.0.0', 61372)
s2 = socket.socket() # create client socket
s2.connect(('localhost', 61372)) # connect to the one above
s3, x = s.accept() # Python specific use; s3 is our connected socket on the server side
s2.getpeername()
# gives ('127.0.0.1', 61372)
s2.getsockname()
# gives ('127.0.0.1', 54663)
s3.getsockname()
# gives ('127.0.0.1', 61372), the same as s2.getpeername(), for symmetry
s3.getpeername()
#gives ('127.0.0.1', 54663), the same as s2.getsockname(), for symmetry
#test the connection
s2.send('hello')
print s3.recv(10)
Diese Antwort ist unvollständig, da sie auch dafür verantwortlich ist, welche Netzwerkschnittstellen über eine IP-Adresse, z. '0.0.0.0' – user3338098