我正在处理一个有时无法接受()连接的错误服务器(但是将其侦听套接字打开)。这是在Linux上使用unix域套接字。
目前检测此问题的唯一方法是,在发送一堆数据后,缓冲区会填满并阻塞,服务器不会发送任何回复。这种长期故障模式很难与其他错误区分开来 - 服务器可能因其他原因而无法响应。
特别是对于unix域套接字,内核似乎应该知道是否发生了accept();有没有办法找到这个?客户端可以阻塞,直到accept()以某种方式发生,或者至少检查它是否有?
这仅用于调试目的,因此可能有点难看。
答案 0 :(得分:3)
我会说答案是更改协议,以便服务器先说话(如SMTP,而不是HTTP)
内核在进行accept()系统调用之前已接受套接字;如果它永远不会到达,那么插座就会处于等待状态。没有办法将此与接受连接但不说话的服务器区分开来。这是BSD套接字始终有效的方式。
答案 1 :(得分:3)
看起来答案是“不”;内核无法获取此信息。
(更改协议不是答案,因为我正在调试预先存在的不可更改的协议)