哪个套接字,clientSocket = accept()或listen(套接字),你是否设置了启动SO_KEEPALIVE以获得与客户端的连接不丢弃?
答案 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()
返回的套接字上设置选项。