A client socket does not listen for incoming connections, it
initiates an outgoing connection to the server. The server socket
listens for incoming connections.
A server creates a socket, binds the socket to an IP address and
port number (for TCP and UDP), and then listens for incoming
connections. When a client connects to the server, a new socket is
created for communication with the client (TCP only). A polling
mechanism is used to determine if any activity has occurred on any
of the open sockets.
A client creates a socket and connects to a remote IP address
and port number (for TCP and UDP). A polling mechanism can be used
(select(), poll(), epoll(), etc) to monitor the socket for
information from the server without blocking the thread.
In the case that the client is behind a router which provides
NAT (network address translation), the router re-writes the address
of the client to match the router's public IP address. When the
server responds, the router changes its public IP address back into
the client's IP address. The router keeps a table of the active
connections that it is translating so that it can map the server's
responses to the correct client.