如何在winsock中“发送”非阻塞

时间:2013-06-21 03:07:35

标签: c++ windows winsock

我正在制作一个程序,它以固定的间隔向服务器发送UDP数据包,如下所示:

while (!stop) {
    Sleep(fixedInterval);

    send(sock, pkt, payloadSize, flags);
 }

但是无法保证周期性,因为send是阻止通话(例如,当fixedInterval为20毫秒,而对send的通话大于20毫秒)。你知道如何将send变成非阻塞操作吗?

4 个答案:

答案 0 :(得分:7)

您需要使用非阻塞套接字。发送/接收功能与阻塞或非阻塞操作的功能相同,但您必须将套接字本身设置为非阻塞。

u_long mode = 1;  // 1 to enable non-blocking socket
ioctlsocket(sock, FIONBIO, &mode);

另外,请注意使用非阻塞套接字是完全不同的。你需要确保你成功处理WSAEWOULDBLOCK错误! :)

因此,使用非阻塞套接字可能有所帮助,但仍不能保证确切的时间段。你最好从计时器驱动它,而不是这个简单的循环,这样即使在非阻塞模式下,调用send的任何延迟都不会影响时间。

答案 1 :(得分:3)

API ioctlsocket可以做到。你可以使用它如下。但是你为什么不在winsock中使用I / O模型?

ioctlsocket(hsock,FIOBIO,(unsigned long *)& ul);

答案 2 :(得分:0)

我的记忆很模糊,因为我使用UDP非阻塞可能需要15年。

但是,有些事情你应该知道。

  1. 如果您要通过公共网络,只发送小数据包。如果不编写客户端或服务器来处理不完整的数据包,PATH MTU可能会使您失望。

  2. 确保检查是否已发送了您认为必须发送的字节数。当你期望看到发送300个字节而接收端只得到248时,它会变得奇怪。客户端和服务器端都必须知道这个问题。

  3. 有关Linux人员的一些好建议,请参阅here

  4. 有关UDP的

  5. 的Unix Socket FAQ,请参阅here
  6. This是一个很好的通用网络编程常见问题解答和示例页面。

答案 3 :(得分:-1)

如何测量发送时间,然后只是睡觉时缺少20毫秒?