我应该如何在WinSock的UDP中从服务器向客户端发送消息?

时间:2011-11-29 12:26:24

标签: sockets udp winsock

我正在学习WinSock UDP。我见过的大多数教程都要求我:

在服务器端:

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

在客户端:

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

但我想知道如何以其他方式做,将数据从服务器发送到客户端。我不知道客户端的端口(我发现每个sendto呼叫都有所不同),我希望能够将客户端behihd NAT连接到服务器并仍然从服务器中恢复数据。

现代游戏是如何完成的?

1 个答案:

答案 0 :(得分:2)

有两个问题。

查找地址

声明函数recvfrom

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

因此,您可以在from中使用fromlensendto

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

NAT

NAT-box应该自动允许服务器“回答”到客户端发送的数据报。因此,客户端发送数据报这一事实导致NAT-box短暂(几分钟?)打开一个端口以允许流量返回。