Да - вам нужно один разъем для каждого соединения.
Сокет представляет собой комбинацию IP-адрес клиента + порт клиента + IP-адрес сервера + порт сервера. Если клиент общается с несколькими серверами, он использует несколько портов на клиентском компьютере.
Каждый раз, когда вы подключаете () сокет, вы выделяете новый порт.
Вы можете указать, какой клиентский порт вы хотите использовать, связывая () с номером порта. В противном случае операционная система выбирает порт для вас. Это называется "эфемерным" портом.
Если сервер общается с несколькими клиентами, для каждого клиента создается вызов для вызова accept ().
аналогия, которую я помню:
Представьте, что у вас есть многоквартирный дом, в котором живет много людей. Люди в квартире могут пользоваться почтовыми ящиками.
Жилой дом соответствует компьютеру, люди в квартире соответствуют программам, запущенным на компьютере, а почтовые ящики - это порты. Каждый порт может одновременно использоваться только одним приложением в качестве своего частного блока ввода / вывода.
Сокет - это связь между одним почтовым ящиком в одном здании и одним почтовым ящиком в другом. Это адрес «до» и «от». API сокетов использует сокет, чтобы знать, куда отправлять пакеты и какой адрес ответа помещать в пакет. Сокет может даже связывать два почтовых ящика в одном здании.
Одно приложение на компьютере может использовать много портов, и они могут даже быть подключены к одному и тому же порту на том же удаленном компьютере. Поэтому информация о сокете (IP-адрес + порт на на обоих подключенных компьютерах) необходима для устранения любой неопределенности в отношении адресов назначения и возврата.
Аналогично, несколько приложений на одном компьютере могут быть подключены к одному и тому же порту на одном сервере и отправлять запросы, но сервер отправляет свой ответ нужному приложению, поскольку адреса возврата имеют разные номера портов.
Сокет имеет одинаковые 4 фрагмента информации на обеих коммуникационных машинах.
При взаимодействии клиент / сервер для веб-сервера многие клиенты подключаются к одному порту сервера. Таким образом, все сокеты выглядят как {client (n) IP, client (n) порт, IP-адрес сервера, порт 80 сервера}.
Как сказал @DavidGelhar, теоретически было бы возможно, чтобы несколько серверов обменивались данными с одним и тем же портом на клиенте, поскольку информация о сокете указывает правильный адрес сервера для отправки. Однако вы не можете подключить () один порт несколько раз. Все серверы могут подключаться () к одному и тому же клиентскому порту, но их больше нельзя называть серверами:)
По сути, сокет - это просто структура данных из 4 частей, которую API сокетов использует, чтобы узнать, куда отправлять данные и какой адрес возврата помещать в данные. Аналогично, «порт» - это просто число, используемое в качестве адреса для назначения конкретного приложения на машине, это ни в коем случае не фактический аппаратный объект.