如何解决本地socket关闭后如何重新绑定?
如果一个 unix 套接字绑定到一个路径,listen()
s 并做一些工作,之后它被关闭,套接字“文件”保留在文件系统中。但是如果我尝试 connect()
到那条路径,我会得到
Connect errno:111
Connection refused
那么“神器”之后还剩下什么?它仍然是文件系统上的 inode
(我可以用 ls
看到它),但它没有绑定,不听,我不能cat
,否则我得到
cat: /tmp/unix.str: No such device or address
那么 inode
还剩下什么?我怎样才能让这个“神器”再次活跃起来,绑定和监听套接字( 删除它,并使用该路径创建新的套接字)?
解决方法
尝试连接时您会收到“连接被拒绝”的消息,因为该本地套接字上没有任何内容正在侦听。如果没有任何东西在侦听该端口号,这与您尝试与 TCP 套接字建立连接是一样的。
一旦打开套接字的程序关闭,该进程就有责任用 unlink
删除文件。 man page 声明:
使用文件名绑定到套接字会在 调用者必须删除的文件系统,当它不是时 需要更长的时间(使用 unlink(2))。通常的 UNIX 紧随其后 语义适用;套接字可以随时取消链接,并将 当最后一次引用时最终从文件系统中删除 它已关闭。
如果程序意外崩溃,这当然可能是一个问题,因此您可以通过额外使用锁定文件来解决这个问题。
另一种替代方法是使用抽象套接字地址。这是通过将 sun_path
中 sockaddr_un
的第一个字节设置为 0 并将其余字节设置为指定套接字名称的空终止字符串来完成的。例如:
struct sockaddr_un sun;
sun.sun_family = AF_UNIX;
sun.sun_path[0] = 0;
strcpy(sun.sunpath + 1,"mysocketname");
这会为您提供一个命名套接字,而文件系统中没有相应的套接字文件。一旦套接字描述符关闭,此套接字将自动消失,因此可以使用该名称打开另一个套接字。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。