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

标签 linux sockets udp posix

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

服务器:

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);

最佳答案

你还没有连接服务器端。将套接字绑定(bind)到地址会建立本地 对等点的地址。但是,在绑定(bind)套接字之后,您立即执行了一个发送,但您没有指定目的地。 IE。要发送的数据在哪里?

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

所以每一方都需要创建一个套接字并将其绑定(bind)到他们选择的地址。然后,客户端可以连接到服务器的地址(永久建立目标地址),或者它可以使用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)

关于SOCK_DGRAM 上的 Linux 抽象套接字拒绝连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48633209/

相关文章:

.net - 高性能UDP服务.NET

c - 使用我自己的结构在套接字编程中填充 UDP 负载?

linux - 如何通过 Linux 终端滚动?

linux - 扫描可用的 WiFi 网络会产生奇怪的字符 (Raspbian)

mysql - Linux MySQL - 无法登录root

c - 如何使用 fork() 通过服务器连接两个客户端

linux - 我可以使用 SO_REUSEPORT 将单个 UDP 流分发到多个接收器线程吗?

linux - 使用 defsym 定义的符号在 Ubuntu 16.10 上给出了错误的地址

c - sizeof()在c中返回奇怪的值

javascript - 检查UDP套接字是否在某个端口上运行,关闭它,然后再次运行