gpt4 book ai didi

networking - 断开并重新连接已连接的数据报套接字

转载 作者:行者123 更新时间:2023-12-02 02:37:16 25 4
gpt4 key购买 nike

我正在尝试创建一个基于数据报套接字 (UDP) 的迭代服务器。它调用连接到它从第一个 recvfrom() 调用获得的第一个客户端(是的,我知道这不是真正的连接)。为这个客户提供服务后,我断开 UDP 套接字(使用 AF_UNSPEC 调用连接)然后我调用 recvfrom() 从下一个客户端获取第一个数据包。

现在的问题是,在循环的第二次迭代中调用 recvfrom() 返回 0。我的客户从不发送空数据包,所以会发生什么。

这就是我正在做的(伪代码):

s = socket(PF_INET, SOCK_DGRAM, 0)

bind(s)

for(;;)
{
recvfrom(s, header, &client_address) // get first packet from client
connect(s,client_address) // connect to this client
serve_client(s);
connect(s, AF_UNSPEC); // disconnect, ready to serve next client
}

编辑:我发现我的客户端不小心发送了一个空数据包中的错误。现在我的问题是如何让客户端等待服务,而不是将请求发送到无处(服务器连接到另一个客户端并且还没有为任何其他客户端提供服务)。

最佳答案

connect() 在 SOCK_DGRAM 上真的完全没有必要。

调用 connect 不会阻止您从其他主机接收数据包,也不会阻止您发送它们。别费心了,这真的没什么用。

更正:是的,显然它会阻止您从其他主机接收数据包。但是在服务器上这样做有点傻,因为当你连接到一个客户端时,任何其他客户端都会被锁定。此外,您仍然需要捕捉四处漂浮的“谷壳”。可能存在一些与 DGRAM 套接字上的 connect() 相关的竞争条件 - 如果您调用 connect 并且来自其他主机的数据包已经在缓冲区中,会发生什么情况?

此外,0 是 recvfrom() 的有效返回值,因为空(无数据)数据包是有效的并且可以存在(事实上,人们经常使用它们)。因此,您无法通过这种方式检查某事是否成功。

十有八九,一个零字节数据包已经在队列中了。

你的协议(protocol)应该设计成尽量减少错误数据报被误解的可能性;出于这个原因,我建议您不要使用空数据报,而是使用魔数(Magic Number)。

UDP 应用程序必须能够识别“chaff”数据包并丢弃它们;他们迟早会出现。

关于networking - 断开并重新连接已连接的数据报套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/911359/

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