network programming: how does s.accept() work?

7stud bbxx789_05ss at
Mon Feb 25 13:28:56 CET 2008

On Feb 25, 5:17 am, 7stud <bbxx789_0... at> wrote:
> On Feb 25, 4:08 am, 7stud <bbxx789_0... at> wrote:
> > The question I'm really trying to answer is: if a client connects to a
> > host at a specific port, but the server changes the port when it
> > creates a new socket with accept(), how does data sent by the client
> > arrive at the correct port?  Won't the client be sending data to the
> > original port e.g. port 5052 in the client code above?
> If I change the clients to this:
> import socket
> import time
> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> host = 'localhost'
> port = 5052  #server port
> print s.getsockname()  #<------------NEW LINE
> s.connect((host, port))
> print s.getsockname()
> response = []
> while 1:
>     piece = s.recv(1024)
>     if piece == '':
>         break
>     response.append(piece)
> Then I get output from the clients like this:
> ('', 0)
> ('', 51439)
> ('', 0)
> ('', 51440)
> The server port 5052(i.e. the one used in connect()) is not listed
> there. That output indicates that the client socket is initially
> created with some place holder values, i.e., 0.  Then accept()
> apparently sends a message back to the client that in effect says,
> "Hey, in the future send me data on port 51439."  Then the client
> fills in that port along with the ip address in its socket object.
> Thereafter, any data sent using that socket is sent to that port and
> that ip address.

Implicit in that description is that the client must get assigned a
port number before the call to connect(), or maybe the call to
connect() assigns a port number to the client.  In any case, the
server has to receive both the client's ip address and port number as
part of the client's request for a connection in order for the server
to know where to send the response.  The server then uses that ip
address and port number to send back a message to the client that
tells the client what port number future communications need to be
sent to.

More information about the Python-list mailing list