как я должен отправлять сообщения с сервера клиенту в WinSock UDP? - PullRequest
1 голос
/ 29 ноября 2011

Я изучаю WinSock UDP. Большинство уроков, которые я видел, просят меня:

На стороне сервера:

SOCKET socked = socket(PF_INET, SOCK_DGRAM, 0)
bind(...);
for(;;) { recvfrom(..); }

На стороне клиента:

SOCKET socked = socket(PF_INET, SOCK_DGRAM, 0);
sendto(...);

Но мне интересно, как я могу поступить иначе, отправив данные с сервера на клиент. Я не знаю порт клиента (я выяснил, что он меняется при каждом вызове sendto), и я хочу иметь возможность подключать клиента к NAT с сервером и получать данные с сервера.

Как это делается в современных играх?

1 Ответ

2 голосов
/ 29 ноября 2011

Там есть два вопроса.

Поиск адреса

Объявлена ​​функция recvfrom:

int recvfrom(
  __in         SOCKET s,
  __out        char *buf,
  __in         int len,
  __in         int flags,
  __out        struct sockaddr *from, /* <--- */
  __inout_opt  int *fromlen           /* <--- */
);

Таким образом, вы можете использовать from иfromlen in sendto.

sendto(..., (SOCKADDR *)from, *fromlen);

NAT

Блок NAT должен автоматически разрешить серверу « ответить » на дейтаграмму, отправленную клиентом,Таким образом, сам факт отправки клиентом дейтаграммы приводит к тому, что NAT-блок эфемерно (на несколько минут?) Открывает порт, чтобы разрешить возврат трафика.

...