2014-09-24 50 views
0

通過無連接數據報Unix套接字發送ECONNREFUSED的可能原因是什麼?ECONNREFUSED數據報Unix套接字

還有關於如何調試這個問題的任何建議是受歡迎的,因爲這個問題是可重現的。

無論使用的是sendto()還是sendmsg(),我都會收到錯誤。

if ((sock = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0) 
{ 
    return 0; 
} 
unlink("/tmp/serv"); 
addr.sun_family = AF_UNIX;  

strncpy(&addr.sun_path[0], "/tmp/serv", sizeof(addr.sun_path)); 

if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) 
{ 
    return 0; 
} 

sockaddr_un from; 
int fromlen = sizeof(from); 
if (recvfrom(sock, &i, sizeof(i),0,(sockaddr*)&from,(socklen_t*)&fromlen) < 0) 
{ 
    //some error handling code 
} 

printf("from.sun_family=%d, from.sun_path=%s",from.sun_family,from.sun_path); // this prints, as expected "from.sun_family=1, from.sun_path=/tmp/client" 
strncpy(&addr.sun_path[0], "/tmp/client", sizeof(addr.sun_path)); 
sendto(sock,"abc",3,0,(sockaddr*)&addr, sizeof(addr)); //this fails with ECONNREFUSED 
+0

錯誤,目標套接字不存在? – EJP 2014-09-24 12:07:51

+0

它存在。我編輯了問題中的代碼,以顯示客戶端發送消息,並且'recvfrom'按預期工作。客戶端應用程序停留在'recv()'(我可以在那裏斷點) – George 2014-09-24 12:20:04

+0

@George哪裏調用你的代碼給你ECONNREFUSED? – nos 2014-09-24 12:21:45

回答

1

man 7 unix來自:

ECONNREFUSED 通過連接(2)不是偵聽套接字所指定的遠程地址。 如果目標文件名不是套接字,也會發生此錯誤。

在Linux中,sendto在Unix套接字does the following

1548   if (sock_flag(other, SOCK_DEAD)) { 
1549     /* 
1550     *  Check with 1003.1g - what should 
1551     *  datagram error 
1552     */ 
1553     unix_state_unlock(other); 
1554     sock_put(other); 
1555 
1556     err = 0; 
1557     unix_state_lock(sk); 
1558     if (unix_peer(sk) == other) { 
1559       unix_peer(sk) = NULL; 
1560       unix_state_unlock(sk); 
1561 
1562       unix_dgram_disconnected(sk, other); 
1563       sock_put(other); 
1564       err = -ECONNREFUSED; 
1565     } else { 
1566       unix_state_unlock(sk); 
1567     } 
1568 
1569     other = NULL; 
1570     if (err) 
1571       goto out_free; 
1572     goto restart; 
1573   } 

換句話說,對插座的另一端沒有讀者發送到,或者套接字不不再存在文件系統。

+0

那麼,我有一個在另一端(客戶端)的套接字,綁定工作正常。我甚至可以從客戶端發送東西,並通過服務器上的recvfrom接收。 – George 2014-09-24 12:43:25

+0

@George您的客戶可能在發送後終止。 – 2014-09-24 12:51:50

+0

恐怕不是,客戶端有一些非常簡單的代碼,它使用'sendto()'發送,它在'recv()'中等待。 – George 2014-09-24 13:05:44