2014-09-24 35 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