Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SOCK_DGRAM上的Linux抽象套接字拒绝连接_Linux_Sockets_Udp_Posix - Fatal编程技术网

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

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,

我正在使用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)。”