SOCK_DGRAM上的Linux抽象套接字拒绝连接

时间:2018-02-05 23:31:53

标签: linux sockets udp posix

我正在使用AF_UNIX套接字编写一个简单的客户端 - 服务器应用程序,但我的代码不起作用。当我想发送到套接字时,我得到传输端点未连接错误。有什么建议吗?

SERVER:

struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family=AF_UNIX;
strcpy(addr.sun_path+1,"example");
addr.sun_path[0]=0;
int mysock = socket(AF_UNIX, SOCK_DGRAM, 0);
if((bind(mysock, (struct sockaddr *)&addr,sizeof(addr)))<0)
{
  perror("bind() error");
  return false;
}
if (send(mysock, path, sizeof(path), 0)<0)
{
  perror("send");
}

客户端:

struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
int mysock = socket(AF_UNIX, SOCK_DGRAM, 0);
if(mysock<0)
{
  perror("socket() error");
  return false;
}
addr.sun_family=AF_UNIX;
strcpy(addr.sun_path+1,"example");
addr.sun_path[0]=0;
if((connect(mysock, (struct sockaddr *)&addr,sizeof(addr)))<0)
{
  perror("connects() error");
  return false;
}
recv(mysock, buf, sizeof(buf),0);
printf("%s\n",buf);

2 个答案:

答案 0 :(得分:0)

  

运输未连接

您无法在未连接的UDP套接字上使用send()。您需要connect()或使用sendto()。这都是记录在案的。

NB什么是&#39; Linux抽象套接字&#39;意思?我没有看到任何关于你的代码的摘要。您还缺少recv()上的错误检查,如果套接字未连接,则需要recvfrom()

答案 1 :(得分:0)

您还没有连接服务器端。将套接字绑定到地址会建立本地对等体的地址。但是,在绑定套接字后,您立即执行send但尚未指定目的地。即要发送的数据在哪里?

此外,Unix域数据报套接字与其他套接字不同,因为双方需要在双向数据传输发生之前建立本地地址。

因此,每一方都需要创建一个套接字并将bind设置为他们选择的地址。然后,客户端可以connect到服务器的地址(永久地建立目标地址),也可以使用sendto来指定每个缓冲区的目标地址。

服务器通常会使用recvfrom接收数据客户端的地址,然后使用sendto将响应返回给客户端。

为了清楚起见,这个例子在python3中。服务器代码:

import socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
sock.bind(b'\x00server')            # Our address
data, addr = sock.recvfrom(1024)
print("Data:", data)
print("Client Address:", addr)
sock.sendto(data, addr)

客户代码:

import socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
sock.bind(b'\x00client')      # Our address
sock.connect(b'\x00server')   # Server's address
data = b"Hello"
sock.send(data)
print("Sent", data)
rdata, saddr = sock.recvfrom(1024)
print("ReturnedData:", rdata)
print("ServerAddr returned:", saddr)