【发布时间】:2016-02-25 08:05:10
【问题描述】:
在 OS-X 下,我有一个名为“listener”的进程,它正在等待“accept”从名为 listener_socket 的本地 unix 套接字读取数据。不幸的是,任何连接该套接字的尝试都会以“连接被拒绝”错误终止。
使用 lsof,确保“侦听器”实际侦听此套接字:
sudo lsof -p 570
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
...
listener 570 root 3u unix 0x48a2751a1bad61ef 0t0 /private/var/run/my_sockets/listener_socket
请注意,该文件实际上是一个有效的 unix 套接字:
file /private/var/run/my_sockets/listener_socket /private/var/run/my_sockets/listener_socket: socket
但是,它仍然无法连接,即使我使用命令的替代方式(例如(使用 socat 命令))
sudo socat LOCAL:/private/var/run/my_sockets/listener_socket,interval=1 EXEC:'aaaaaaaaaaaaaaaaa',nofork
2015/11/23 00:57:33 socat[928] E connect(3, LEN=49 AF=1 "/private/var/run/my_sockets/listener_socket", 49): Connection refused
也许我可以做更多的事情来弄清楚为什么我不能将数据发送到套接字,即使很明显“侦听器”在另一端等待这个数据?
这是我的代码的相关部分:
发件人:
sockfd = socket(PF_UNIX, SOCK_STREAM, 0);
address.sun_family = AF_UNIX;
snprintf(address.sun_path, UNIX_PATH_MAX, "%s", LISTENER_SOCKET_PATH);
connect(sockfd, (struct sockaddr *) &address, sizeof(struct sockaddr_un)
write ...
接收者:
fd = socket(PF_UNIX, SOCK_STREAM, 0);
unlink(sock_name); // in case the socket is used before
listen(server->fd, 5); // we don't reach 5 listeners for sure ...
chmod(sock_name, mode); // giving root privilages
accept(server->fd, (struct sockaddr *) &server->address, &server->address_length);
read ...
谢谢
【问题讨论】:
-
请发布源代码,最好是“最小、完整、可验证的示例”。有关指南,请参阅 stackoverflow.com/help/mcve。
-
你检查过socket文件的权限了吗?
-
@TheDarkKnight,注意 'ls -ltr' 显示:srw------- 1 root daemon 0 Nov 22 07:09 /private/var/run/my_sockets/listener_socket 和父运行侦听器的进程具有 pid 0,因此侦听器也具有 root 特权 0 49 1 0 6:36AM ?? 3:24.06 /Library/Application Support/PaloAltoNetworks/Traps/bin/trapsd
-
@Zohar 这还不够——您需要发布一个完整、可编译(但仍然最小)例子。
-
两件事:在接收方,您错过了对
bind()的调用(可能在您准备在此处发布的代码时意外删除),以及2)在accept(server->fd, (struct sockaddr *) &server->address, &server->address_length);中您是否正在设置server->address_length 之前调用accept()?
标签: c macos sockets unix-socket