gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:52 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com