SOCK_DGRAM上的Linux抽象套接字拒绝连接
我正在使用AF_UNIX套接字编写一个简单的客户机-服务器应用程序,但我的代码不起作用。当我想发送到套接字时,我得到传输端点未连接错误。有什么建议吗 服务器:SOCK_DGRAM上的Linux抽象套接字拒绝连接,linux,sockets,udp,posix,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,
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\u un addr;
memset(&addr,0,sizeof(addr));
地址sun_family=AF_UNIX;
strcpy(地址sun_路径+1,“示例”);
地址太阳路径[0]=0;
int mysock=socket(AF_UNIX,SOCK_DGRAM,0);
if((bind(mysock,(struct sockaddr*)和addr,sizeof(addr)))
传输未连接
您不能在未连接的UDP套接字上使用send()
。您需要对其进行connect()
或使用sendto()
。这些都有文档记录
注意,“Linux抽象套接字”是什么意思?我看不到您的代码有任何抽象。您还缺少对recv()
的错误检查,如果套接字未连接,则需要recvfrom()
传输未连接
您不能在未连接的UDP套接字上使用send()
。您需要对其进行connect()
或使用sendto()
。这些都有文档记录
注意,“Linux抽象套接字”是什么意思?我看不到您的代码有任何抽象。您还缺少对recv()
的错误检查,它需要是recvfrom()
如果套接字未连接。您尚未连接服务器端。将套接字绑定到地址将建立本地对等方的地址。但是,绑定套接字后,您立即执行发送
,但尚未指定目的地。即,要发送的数据在哪里
此外,Unix域数据报套接字与其他套接字不同,因为在双向数据传输发生之前,双方都需要建立本地地址
因此,每一方都需要创建一个套接字并将其绑定到自己选择的地址。然后,客户端可以连接到服务器地址(永久建立目标地址),也可以使用发送到为每个缓冲区指定目标地址
服务器通常使用recvfrom
接收数据和客户端地址,然后使用sendto
将响应返回给客户端
为了清楚起见,在python3.Server代码中的示例如下:
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)
您尚未连接服务器端。将套接字绑定到地址将建立本地对等方的地址。但是,绑定套接字后,您立即执行send
,但尚未指定目标。即,要发送的数据在哪里
此外,Unix域数据报套接字与其他套接字不同,因为在双向数据传输发生之前,双方都需要建立本地地址
因此,每一方都需要创建一个套接字并将其绑定到自己选择的地址。然后,客户端可以连接到服务器地址(永久建立目标地址),也可以使用发送到为每个缓冲区指定目标地址
服务器通常使用recvfrom
接收数据和客户端地址,然后使用sendto
将响应返回给客户端
为了清楚起见,在python3.Server代码中的示例如下:
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)
OP的意思是“抽象名称空间”。从unix(7)
:“传统上,unix域套接字可以是未命名的,也可以绑定到文件系统路径名(标记为socket类型)。Linux还支持独立于文件系统的抽象名称空间。”…“抽象套接字地址的区别在于…sun_路径[0]是一个空字节(0)。“OP表示“抽象名称空间”。从unix(7)
:“传统上,unix域套接字可以未命名,也可以绑定到文件系统路径名(标记为socket类型)。Linux还支持独立于文件系统的抽象名称空间。”。。。。“抽象套接字地址的区别在于…sun_路径[0]是空字节(0)。”