Windows RIO套接字已注册的I / O发送延迟RIOSend

时间:2015-07-16 13:53:35

标签: windows sockets tcp winsock2

我使用RIOSend在分布式网络上发送部分TCP数据 Nagle被关闭以达到最小延迟 当目的地是本地时看起来都很好,但是如果真的很远(约40毫秒ping)目的地我看到这个问题:
当我发送部分数据时,下一部分delaeyd,无论RIOSend标志 - RIO_MSG_DONTNOTIFY,RIO_MSG_DEFER还是0。 看起来像从另一边发送waiiting的ACK .... 当我使用简单发送一切都很好。
请帮我解决这个问题!

2 个答案:

答案 0 :(得分:0)

尝试添加RIO_MSG_COMMIT电话; RIO_MSG_DEFER将延迟您的数据,RIO_MSG_DONTNOTIFY意味着IOCP或事件在完成时不会被引发,尽管它仍将被添加到队列中。

如果TCP连接上的重新传输超时设置为低?你最终获得了数据吗? (例如300ms之后)

您是否使用以下代码禁用Nagle:

int True = -1; int result = setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (char*)&True, 4)

您还在接收器上使用RIO吗?如果是这样,您使用IOCP,事件或轮询的方法是什么?

请记住,在收到IOCP消息后,您需要致电RIONotify以接收另一个消息。

除此之外:从C#测试here获得一些托管互操作,代码为here;可能会提供一些检查的东西;语言可能不一样,但调用应该基本相同。

actual sending功能可能会有所帮助。

答案 1 :(得分:0)

您似乎无法在RIO TCP套接字上禁用Nagle。

https://social.msdn.microsoft.com/Forums/en-US/6a551731-c339-44b8-b1a5-68240962e458/unable-to-disable-nagle-algorithm-while-using-registered-io-winsock-extension-for-tcp-communication?forum=wsk

我有同样的问题。我写了一个upd / tcp ping测试,服务器发送UDP数据包,客户端接收它,然后用TCP响应。

如果我让服务器一个接一个地发送3条消息,我得到与NIO禁用的RIO相同的结果,就像我使用Nagle仍然启用的常规套接字一样。

第一个数据包TCP响应快速进入,其他2个等待200毫秒,以便ack计时器到期。

我已经运行wireshark来验证所有这些,窗口大小没有任何问题。

*编辑* 很有趣,因为我刚刚重新访问了这一点。事实证明,NIO for RIO没有任何问题。我对TCP发送器的初始编码是使用1个缓冲区的阻塞模型。所以发生了什么,就是当我想发送数据时,操作系统现在保留在缓冲区上,直到我们得到一个ack,所以如果查看网络捕获,它就像Nagle一样启用了 LOOKED ,因为它在确认之前不会释放唯一的缓冲区。我要更改我的TCP发送器以使用多个出站缓冲区,只需要弄清楚一些细节,比如如果只有一个缓冲区的一部分是确认的话该怎么办。