Сервер прослушивает адрес и порт. Например, IP-адрес вашего сервера 10.0.0.1, и он прослушивает порт 8000.
Ваш IP-адрес клиента - 10.0.0.2, и клиент «подключается» к серверу через порт 8000 10.0.0.1. В TCP-соединении вы указываете порт сервера, к которому хотите подключиться. Ваш клиент фактически получит свой собственный номер порта, но вы не контролируете его, и он будет отличаться для каждого соединения. Клиент выбирает порт server , к которому он хочет подключиться, а не порт client , к которому он подключается.
Например, при первом соединении ваш клиент может получить клиентский порт 12345. Он подключается от 10.0.0.2 порта 12345 к серверу 10.0.0.1 к порту 8000. Ваш сервер может видеть, к какому порту подключается клиент. вызвав getpeername на его стороне соединения.
Когда клиент подключается во второй раз, номер порта будет другим, скажем, порт 12377. Сервер может увидеть это, вызвав getpeername во втором соединении - он увидит другой номер порта на стороне клиента. (getpeername также показывает IP-адрес клиента.)
Кроме того, каждый раз, когда вы вызываете accept на сервере, вы получаете новый сокет. У вас все еще есть исходный сокет прослушивания, и при каждом принятии вы получаете новый сокет. Вызовите getpeername на принятом сокете, чтобы увидеть, с какого клиентского порта идет соединение. Если к вашему серверу подключены два клиента, теперь у вас есть три сокета - исходный сокет прослушивания и сокеты каждого из двух клиентов.
Вы можете иметь много клиентов, подключенных к одному и тому же порту сервера 8000 одновременно. И многие клиенты могут быть подключены с одного и того же клиентского порта (например, порта 12345), но не с одного и того же IP-адреса. С того же IP-адреса клиента, например, 10.0.0.2, каждое клиентское соединение с портом 8000 сервера будет осуществляться с уникального клиентского порта, например, 12345, 12377 и т. Д. Вы можете отличить клиентов по их комбинации IP-адреса и порта.
Один и тот же клиент может также иметь несколько подключений к серверу одновременно, например, одно соединение с клиентского порта 12345 и другое с 12377 одновременно. Под клиентом я имею в виду исходный IP-адрес, а не конкретный программный объект. Вы просто увидите два активных соединения с одинаковым IP-адресом клиента.
Кроме того, со временем комбинация клиент-адрес и клиент-порт может быть повторно использована. То есть, в конце концов, вы можете увидеть, что новый клиент приходит с 10.0.0.2 порта 12345, спустя много времени после того, как первый клиент на 10.0.0.2 порту 12345 отключился.