为什么在运行服务器套接字并使用shutdown()之后,该目录中是否有文件?

Ale*_*620 4 c sockets

因此,我使用C语言编写了一个基本的服务器和客户端程序,运行该程序后,我得到一个真正奇怪的命名文件,必须删除该文件才能使程序再次运行。我认为我不正确地关闭了插座。目前,我正在关闭插座,如下所示:

shutdown(serverSocket, SHUT_RDWR);
shutdown(clientSocket, SHUT_RDWR);
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?

编辑:这两个函数都返回0

这是导致问题的代码:

    char buf[1024];
    struct sockaddr_in server, client;

    int serverSocket = socket(PF_LOCAL, SOCK_STREAM, 0);

    server.sin_family = AF_LOCAL;
    server.sin_port = htons(54164);
    server.sin_addr.s_addr = inet_addr("127.0.0.1");

    bind(serverSocket, (struct sockaddr *) &server, sizeof(server));
Run Code Online (Sandbox Code Playgroud)

在运行绑定功能之前,该文件不会显示。

pad*_*ddy 5

看来您使用了错误的套接字地址结构。您正在使用struct sockaddr_in(适用于AF_INET家庭)。

但是,在使用AF_LOCAL(aka AF_UNIX)系列时,bind希望您传递一个struct sockaddr_un,它指定套接字(在文件系统中)的路径。

根据unix套接字联机帮助页

UNIX域套接字地址以以下结构表示:

struct sockaddr_un {
    sa_family_t sun_family;               /* AF_UNIX */
    char        sun_path[108];            /* pathname */
};
Run Code Online (Sandbox Code Playgroud)

sun_family字段始终包含AF_UNIX。在Linux上,sun_path的大小为108个字节。

另外:

绑定到具有文件名的套接字会在文件系统中创建一个套接字,当不再需要该套接字时,调用方必须将其删除(使用unlink(2))。通用的UNIX封闭式语义适用;套接字可以随时取消链接,并且在最后一次关闭套接字时,最终将其从文件系统中删除。