我遇到这样的情况:在后台运行的服务通过放置在文件系统上的套接字(SOCK_DGRAM)使自己可用于基于ASCII的命令。我能够成功地向此接口发送命令,但无法接收后台服务生成的任何响应。
据我了解,我没有收到服务的响应的原因是因为底层IPC在技术上并不介于两个进程之间,而是介于地址之间< / em>的。因此,有必要将我的端点绑定到特定的地址位置,以便服务知道发送其响应。但是,问题是我不想用太多额外的套接字文件污染目录空间。
也就是说,我可以通过简单地执行以下操作来完成这项工作:
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
一切都很好,因为通过 bind 到 mySocketFile ,服务有一个地址可以响应。
简而言之,有没有办法通过可用的套接字接口与服务进行通信和接收响应而不绑定本地端点,以便创建另一个套接字 - 在文件系统上输入文件?即某种无名套接字?
当然,如果有人在我的逻辑中发现任何误解或误解,请指出它们。
答案 0 :(得分:3)
如果客户端没有将其套接字绑定到文件系统地址,它仍然有一个由系统分配的名义地址(可能存在于/ tmp中的文件系统中,或者可能根本不存在于文件系统中,取决于OS)。服务器可以通过使用recvfrom(2)调用来接收来自客户端的传入数据包来获取此地址 - 此调用需要使用客户端套接字地址填充的其他sockaddr *和socklen_t *参数。然后使用sendto(2)将回复发送回客户端。