因此,我使用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)
在运行绑定功能之前,该文件不会显示。
看来您使用了错误的套接字地址结构。您正在使用struct sockaddr_in(适用于AF_INET家庭)。
但是,在使用AF_LOCAL(aka AF_UNIX)系列时,bind希望您传递一个struct sockaddr_un,它指定套接字(在文件系统中)的路径。
UNIX域套接字地址以以下结构表示:
Run Code Online (Sandbox Code Playgroud)struct sockaddr_un { sa_family_t sun_family; /* AF_UNIX */ char sun_path[108]; /* pathname */ };sun_family字段始终包含AF_UNIX。在Linux上,sun_path的大小为108个字节。
另外:
绑定到具有文件名的套接字会在文件系统中创建一个套接字,当不再需要该套接字时,调用方必须将其删除(使用unlink(2))。通用的UNIX封闭式语义适用;套接字可以随时取消链接,并且在最后一次关闭套接字时,最终将其从文件系统中删除。