Winsock TCP recv()挂起5秒钟

时间:2014-10-15 14:46:46

标签: sockets visual-c++ delay winsock recv

我有一个本机Visual C ++应用程序,它充当套接字服务器:它接受传入的TCP连接,并从这些套接字读取一些数据。 一旦服务器接收/接受新的TCP连接,就会产生一个新线程,并且该连接套接字上的所有读取(即,对recv()的调用)都发生在该单独的线程中。所有通信都是根据明确定义的标准应用程序级协议完成的,由不同开发人员/供应商的多个客户端实现。因此,我的服务器应用程序能够与不同开发人员/供应商的客户端通信,只要他们遵守这个定义良好的应用程序级协议。

现在,我的服务器应用程序可以正常使用99.9%的客户端应用程序。然而,我只是遇到了几个客户,我遇到了奇怪的延迟。

特别是,对于这些“有问题”的客户端,一旦客户端连接被我的服务器应用程序接受,recv()调用我的专用“接收器”线程在返回前正好挂起5秒,即使数据应该是可用,因为客户端已经完成了几个send()调用。

连接到我的服务器应用程序的客户端运行在与运行我的服务器应用程序的主机相同的LAN上的主机上。

请注意以下事实:

1 - 对于这些特定的“有问题”客户端,我的服务器应用程序中的 ALL recv()调用会在返回之前挂起5秒钟。

2 - 我的服务器应用程序正常工作(即,recv()显示没有相关的延迟)与其他客户端(实际上,绝大多数客户端)。

3 - 另一方面,那些“有问题”的客户端似乎与其他第三方服务器应用程序一样正常(即没有特别的延迟),这些应用程序实现了与我自己的服务器应用程序相同的应用程序级协议。其中一些第三方服务器应用程序是开源的:我已经检查了那些第三方服务器应用程序的源代码,但我发现它们的实现没有任何相关的差异,这显然证明了我的5秒延迟是合理的。体验我的服务器应用程序。

我意识到我用非常通用的术语描述了这个问题,但也许这个“5个精确秒”的延迟可能会告诉某些TCP / IP专家......

我真的很感激任何提示或建议来解决这个问题。

提前致谢并致以最诚挚的问候。

2 个答案:

答案 0 :(得分:0)

如果您想暂停超时以使其延迟超过x秒,请查看使用函数select()

答案 1 :(得分:-1)

您要连接的服务器在其HTTP输出标头中发送Keep-Alive timeout = 5,max = 100,recv()正在尊重

添加

  

连接:关闭

对他们的输出标题将解决您的延迟。我不知道是否可以使recv()忽略keep-alive指令。

相关问题