Asigna el número de puerto del extremo "local".
Para un socket de servidor, este es el mejor camino a seguir: es exactamente lo que se necesita: tener su socket vinculado al puerto 80 para un servidor web, por ejemplo.
Para un socket de cliente, sin embargo, la dirección local y el puerto normalmente no son importantes. Entonces no lo haces bind()
. Si el servidor restringe a sus clientes para que tal vez tengan un cierto número de puerto o un número de puerto fuera de un rango determinado, también puede usar bind()
en el lado del cliente.
Por otro lado, es posible que también pueda listen()
en un socket donde no ha llamado al bind()
(en realidad no estoy seguro de eso, pero tendría sentido). En este escenario, el puerto de su servidor sería aleatorio y el proceso del servidor comunicaría su puerto a través de un medio diferente al cliente. Imagine un protocolo de "doble conexión" como FTP, donde tiene una conexión de control y una conexión de datos. El puerto en el que se escucha la conexión de datos es completamente arbitrario, pero debe comunicarse al otro lado. Por lo tanto, el "puerto determinado automáticamente" se usa y se comunica.
Un ejemplo en 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)
esta respuesta es incompleta, ya que también es responsable de las interfaces de red para escuchar a través de una dirección IP, p. '0.0.0.0' – user3338098