Сервер фактически прослушивает «хорошо известный порт», а затем переключает последующую связь на выделенный порт для каждого клиента. Требование клиента отправить порт + 1 немного странно
Client 192.168.0.1 - port 12121 ------------------------> Server 192.168.0.2 - port 5050
Client 192.168.0.1 - port 12121 <------------------------ Server 192.168.0.2 - port 23232
Client 192.168.0.1 - port 12121 ------------------------> Server 192.168.0.2 - port 23232 + 1
<------------------------ Server 192.168.0.2 - port 23232
------------------------> Server 192.168.0.2 - port 23232 + 1
Сервер, вероятно, делает это, чтобы ему не приходилось демультиплексировать входящие данные клиента на основе адреса / порта клиента. Это немного более эффективно (как правило), а также имеет некоторые преимущества, в зависимости от конструкции сервера, так как на сервере есть «выделенный» сокет для вас, что означает, что если они выполняют перекрывающийся ввод-вывод затем сокет остается неизменным в течение всего периода связи с вами, что может упростить и повысить эффективность сопоставления данных с сокетом (таким образом, они могут, вероятно, избежать любых поисков или блокировок для обработки каждой дейтаграммы). В любом случае, этого достаточно (см. здесь , если вы хотите знать, почему I делает это так).
С вашей точки зрения, как клиента (и я предполагаю асинхронные сокеты здесь), вам нужно сначала Bind()
ваш локальный сокет (просто используйте INADDR_ANY
и 0
, чтобы ОС могла выбрать порт для затем вы) RecvFrom()
на сокете (так что нет никакой разницы между отправкой данных на сервер на этом сокете и отправкой данных обратно перед выпуском recv). Затем введите SendTo()
для «хорошо известного порта» сервера. Затем сервер отправит вам некоторые данные, а ваш RecvFrom()
вернет вам данные и адрес, с которого сервер отправил вам. Затем вы можете взять этот адрес, добавить его в порт, сохранить этот адрес и с этого момента выдавать SendTo()
s на этот новый адрес отправки, продолжая при этом выдавать RecvFrom()
s для чтения данных сервера; или вы могли бы сделать что-нибудь умное с Connect()
, чтобы привязать удаленный конец сокета к серверу 'send to address' и просто использовать с этого момента Write()
и RecvFrom()
.