我正在使用域套接字从另一个进程获取值,例如A从B获取值,它运行良好数月。但是最近,A在“sendto”消息中偶尔出现“errno 111,连接被拒绝”而失败。域套接字“sendto”遇到“errno 111,连接被拒绝”
我检查了B域套接字绑定文件,它是存在的。我也在另一台机器上做了一些测试,也很好。那么,有没有人遇到过这个问题?任何人都可以有一些线索在这种情况下可能会出错吗?非常感谢。
我正在使用域套接字从另一个进程获取值,例如A从B获取值,它运行良好数月。但是最近,A在“sendto”消息中偶尔出现“errno 111,连接被拒绝”而失败。域套接字“sendto”遇到“errno 111,连接被拒绝”
我检查了B域套接字绑定文件,它是存在的。我也在另一台机器上做了一些测试,也很好。那么,有没有人遇到过这个问题?任何人都可以有一些线索在这种情况下可能会出错吗?非常感谢。
当我看到unix域套接字的这个错误时,通常是因为进程B没有运行,或者连接路径不匹配。 (如果B死了,它会自动重新启动吗?当B已经死亡但尚未重新启动时,故障是否可能发生?)。另一种可能性:是否有可能同时运行多个A副本?如果B的尚未接受的连接队列已满,您可能会收到ECONNREFUSED错误。
我建议strace
下运行两个过程A和B,或者:
strace -o A.log A
,或者,如果该处理已经在运行,
strace -o B.log -p <process-id-of-B>
此外,
netstat -na
将为您提供系统中所有unix域套接字的状态。
请记住,文件系统中的套接字在关闭它们的最后一个描述符时不会自动删除。试图在当时连接或发送将导致错误。服务器需要先删除文件系统中的套接字,然后再重新绑定。
考虑查看并查看B是否用尽文件描述符。如果是这样,你有资源泄漏,需要清理。它不应该是UDP程序的问题,但更有趣的事情是已知的。 lsof
可能是另一个使用的工具。
否则,你有其他人的合理建议 - netstat
尤其应该帮助。
进程B不再是你的(大概DGRAM)插座的另一面 - 也许它死了,或关闭的文件句柄等
在Linux将返回ECONNREFUSED为SOCK_DGRAM或SOCK_SEQPACKET Unix域sendto(2)
套接字如果接收端死了。 (SOCK_STREAM unix套接字不会这样做 - 它们将返回ENOTCONN。)
'netstat -nap'(以root身份运行时)也会显示连接到这些套接字的进程。 – bstpierre 2010-08-10 00:56:48