使用单个 UNIX 套接字的双向通信
Bidirectional communication using a single UNIX socket
我遇到这样一种情况,后台的服务 运行 通过放置在文件系统上的套接字 (SOCK_DGRAM) 使其自身可用于基于 ASCII 的命令。我能够成功地向该接口发送命令,但无法收到后台服务生成的任何响应。
据我所知,我没有收到服务响应的原因是因为底层 IPC 在技术上不介于两个 进程 之间,而是介于 之间]地址。因此,有必要将我的端点 绑定 到特定地址位置,以便服务知道要发送其响应。但是,问题是我不想用太多额外的套接字文件污染目录 space。
也就是说,我可以通过简单地执行以下操作来完成这项工作:
struct sockaddr_un local;
int len;
s = socket(AF_UNIX, SOCK_DGRAM, 0);
local.sun_family = AF_UNIX;
strcpy(local.sun_path, "/path/to/some/dir/mySocketFile");
len = strlen(local.sun_path) + sizeof(local.sun_family);
bind(s, (struct sockaddr *)&local, len);
//Send commands to control interface of background service
一切都很好,因为通过 binding 到 mySocketFile 服务有一个将响应的地址。
简而言之,有没有一种方法可以通过其可用的套接字接口与服务通信并且接收响应而不绑定本地端点,从而创建另一个socket文件系统上的类型文件?即某种 nameless 套接字之类的?
当然,如果有人在我的逻辑中发现任何误解或误解,请指出。
如果客户端没有将其套接字绑定到文件系统地址,它仍然具有系统分配的名义地址(可能存在于/tmp 某处的文件系统中,或者可能根本不存在于文件系统中,取决于 OS)。服务器可以通过使用 recvfrom(2) 调用接收来自客户端的传入数据包来获取此地址——此调用采用额外的 sockaddr * 和 socklen_t * 参数,它用客户端套接字地址填充这些参数。然后您使用 sendto(2) 将回复发送回客户端。
我遇到这样一种情况,后台的服务 运行 通过放置在文件系统上的套接字 (SOCK_DGRAM) 使其自身可用于基于 ASCII 的命令。我能够成功地向该接口发送命令,但无法收到后台服务生成的任何响应。
据我所知,我没有收到服务响应的原因是因为底层 IPC 在技术上不介于两个 进程 之间,而是介于 之间]地址。因此,有必要将我的端点 绑定 到特定地址位置,以便服务知道要发送其响应。但是,问题是我不想用太多额外的套接字文件污染目录 space。
也就是说,我可以通过简单地执行以下操作来完成这项工作:
struct sockaddr_un local;
int len;
s = socket(AF_UNIX, SOCK_DGRAM, 0);
local.sun_family = AF_UNIX;
strcpy(local.sun_path, "/path/to/some/dir/mySocketFile");
len = strlen(local.sun_path) + sizeof(local.sun_family);
bind(s, (struct sockaddr *)&local, len);
//Send commands to control interface of background service
一切都很好,因为通过 binding 到 mySocketFile 服务有一个将响应的地址。
简而言之,有没有一种方法可以通过其可用的套接字接口与服务通信并且接收响应而不绑定本地端点,从而创建另一个socket文件系统上的类型文件?即某种 nameless 套接字之类的?
当然,如果有人在我的逻辑中发现任何误解或误解,请指出。
如果客户端没有将其套接字绑定到文件系统地址,它仍然具有系统分配的名义地址(可能存在于/tmp 某处的文件系统中,或者可能根本不存在于文件系统中,取决于 OS)。服务器可以通过使用 recvfrom(2) 调用接收来自客户端的传入数据包来获取此地址——此调用采用额外的 sockaddr * 和 socklen_t * 参数,它用客户端套接字地址填充这些参数。然后您使用 sendto(2) 将回复发送回客户端。