2010-05-18 239 views
7

我正在使用域套接字从另一个进程获取值,例如A从B获取值,它运行良好数月。但是最近,A在“sendto”消息中偶尔出现“errno 111,连接被拒绝”而失败。域套接字“sendto”遇到“errno 111,连接被拒绝”

我检查了B域套接字绑定文件,它是存在的。我也在另一台机器上做了一些测试,也很好。那么,有没有人遇到过这个问题?任何人都可以有一些线索在这种情况下可能会出错吗?非常感谢。

回答

3

当我看到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域套接字的状态。

+0

'netstat -nap'(以root身份运行时)也会显示连接到这些套接字的进程。 – bstpierre 2010-08-10 00:56:48

1

请记住,文件系统中的套接字在关闭它们的最后一个描述符时不会自动删除。试图在当时连接或发送将导致错误。服务器需要先删除文件系统中的套接字,然后再重新绑定。

2

考虑查看并查看B是否用尽文件描述符。如果是这样,你有资源泄漏,需要清理。它不应该是UDP程序的问题,但更有趣的事情是已知的。 lsof可能是另一个使用的工具。

否则,你有其他人的合理建议 - netstat尤其应该帮助。

0

进程B不再是你的(大概DGRAM)插座的另一面 - 也许它死了,或关闭的文件句柄等

在Linux将返回ECONNREFUSED为SOCK_DGRAM或SOCK_SEQPACKET Unix域sendto(2)套接字如果接收端死了。 (SOCK_STREAM unix套接字不会这样做 - 它们将返回ENOTCONN。)

相关问题