gpt4 book ai didi

c++ - 未连接的 UDP 套接字上的 WSARecvFrom 不返回

转载 作者:行者123 更新时间:2023-11-30 04:35:16 29 4
gpt4 key购买 nike

我正在编写一个测试 UDP 网络服务的小程序。允许服务的实现为 session 创建一个新套接字并从那里响应客户端,此时客户端需要与该地址对话(类似于 TFTP)。

没有错误检查的最小客户端看起来像这样:

int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

sockaddr_in destaddr = { ... };
MSGBUF msg[] = { ... };
DWORD sent;
WSASendTo(fd, msg, sizeof msg / sizeof *msg, &sent, 0, (sockaddr *)sa, sizeof sa, 0, 0);

char buffer[4096];
MSGBUF rcvmsg = { sizeof buffer, buffer };
DWORD received;
sockaddr_storage sa;
socklen_t sa_len = sizeof sa;
DWORD flags = 0;
WSARecvFrom(fd, &rcvmsg, 1, &received, &flags, (sockaddr *)&sa, &sa_len, 0, 0);

如果服务器从与初始消息发送到的相同地址和端口响应,则客户端工作正常,但是来自另一个端口的回复被静默丢弃,并且客户端在 WSARecvFrom 中挂起。

将套接字显式绑定(bind)到 { AF_INET, INADDR_ANY, 0 } 以强制分配本地端口,或调用 listen(fd, 5); 没有区别,正如预期的那样。

WSASendTo 中是否有隐式连接 UDP 套接字的内容,如果有,我应该如何避免这种情况?

最佳答案

UDP 没有连接。数据报被发送到端口和从端口发送;这是一种单向通信。

在我看来,您的服务器让自己被分配了一个临时端口(即在 sockaddr_in 中将 0 作为端口传递),而不是使用特定端口。这行不通。

由于UDP没有连接的概念,每次发送数据,都可能从不同的端口发送;第一次发送不保留给它的端口,它只是从它发送一个数据报然后让它去。

您的服务器应该将自己绑定(bind)到特定端口。

关于c++ - 未连接的 UDP 套接字上的 WSARecvFrom 不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5462952/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com