我正在学习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连接到服务器并仍然从服务器中恢复数据。
现代游戏是如何完成的?
答案 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
中使用fromlen
和sendto
。
sendto(..., (SOCKADDR *)from, *fromlen);
NAT-box应该自动允许服务器“回答”到客户端发送的数据报。因此,客户端发送数据报这一事实导致NAT-box短暂(几分钟?)打开一个端口以允许流量返回。