我正在使用域套接字從另一個進程獲取值,例如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