我正在使用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);
答案 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)