2010-05-18 234 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。)

相關問題