UNIX 套接字连接被拒绝

Zoh*_*r81 7 c sockets macos unix-socket

在 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
Run Code Online (Sandbox Code Playgroud)

请注意,该文件实际上是一个有效的 unix 套接字:

file /private/var/run/my_sockets/listener_socket /private/var/run/my_sockets/listener_socket: socket
Run Code Online (Sandbox Code Playgroud)

但是,它仍然无法连接,即使我使用的是来自命令的替代方式(使用 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
Run Code Online (Sandbox Code Playgroud)

也许我可以做更多的事情来弄清楚为什么我不能将数据发送到套接字,尽管很明显“侦听器”在另一端等待此数据?

这是我的代码的相关部分:

发件人:

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 ...
Run Code Online (Sandbox Code Playgroud)

接收者:

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 ...
Run Code Online (Sandbox Code Playgroud)

谢谢

alk*_*alk 5

服务器似乎错过bind()了对侦听套接字的调用。