哪个套接字,clientSocket = accept()或listen(套接字),你是否设置了SOKE_TOEPALIVE?

时间:2010-06-19 18:40:12

标签: c windows sockets networking winsock

哪个套接字,clientSocket = accept()或listen(套接字),你是否设置了启动SO_KEEPALIVE以获得与客户端的连接不丢弃?

3 个答案:

答案 0 :(得分:2)

在每个接受的套接字上设置选项看起来最可靠和最便携。跨接受的非阻塞模式的继承在各实现之间是不一致的,SO_KEEPALIVE对侦听套接字没有意义。

答案 1 :(得分:1)

SO_KEEPALIVE只能在连接的TCP套接字上工作(因为它需要在定时器上发送数据包),而侦听套接字不是。

请注意,此选项将保持连接不被丢弃(除了在连接不活动一段时间后删除状态的一些损坏的防火墙。)Stevens甚至称它为“死时通知”代替。

请查看this HOWTO文档了解详情。

答案 2 :(得分:0)

来自man页面:

  

如果是SO_KEEPALIVE套接字选项   在已建立的TCP上启用   连接和连接   闲置了两个小时,TCP发送了一个   数据包到远程套接字,   期待远程TCP到   承认连接是   仍然活跃。如果远程TCP确实如此   TCP没有及时回复   继续发送keepalive数据包   根据其正常转播   算法。如果远程TCP没有   在特定时间内回应   限制,TCP丢弃连接。该   下一个套接字系统调用(例如,   recv())返回错误,错误是   设为ETIMEDOUT。

     

有关启用SO_KEEPALIVE。

的详细信息,请参阅getsockopt(2)

在没有发生通信的对等体的空闲时段之后,将向远程对等体发送探测(小数据包)以测试对等体是否仍然存活。

如果对等方仍然可用,将收到ACK消息,因此可以推断出该链接仍处于打开状态。如果不是,那么同伴就会死亡(实际上它有点复杂,因为TCP会在放弃之前做一些重试)。

您可以在客户端和服务器上设置选项(这意味着服务器和客户端都会收到netowrk问题的通知)。无论如何,在服务器上,您将在accept()返回的套接字上设置选项。