微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

本地socket关闭后如何重新绑定?

如何解决本地socket关闭后如何重新绑定?

如果一个 unix 套接字绑定到一个路径,listen()s 并做一些工作,之后它被关闭套接字“文件”保留在文件系统中。但是如果我尝试 connect() 到那条路径,我会得到

Connect errno:111
Connection refused

那么“神器”之后还剩下什么?它仍然是文件系统上的 inode(我可以用 ls 看到它),但它没有绑定,不听,我不能cat,否则我得到

cat: /tmp/unix.str: No such device or address

那么 inode 还剩下什么?我怎样才能让这个“神器”再次活跃起来,绑定和监听套接字( 删除它,并使用该路径创建新的套接字)?

  1. “死”的本地套接字的目的是什么(为什么它关闭后不删除,不再使用它)?

  2. 我怎样才能恢复“死”的套接字? (主要问题)

  3. 谁对错误 connection refused 负责?没有被bind()ed 或不listen()ing?

解决方法

尝试连接时您会收到“连接被拒绝”的消息,因为该本地套接字上没有任何内容正在侦听。如果没有任何东西在侦听该端口号,这与您尝试与 TCP 套接字建立连接是一样的。

一旦打开套接字的程序关闭,该进程就有责任用 unlink 删除文件。 man page 声明:

使用文件名绑定到套接字会在 调用者必须删除的文件系统,当它不是时 需要更长的时间(使用 unlink(2))。通常的 UNIX 紧随其后 语义适用;套接字可以随时取消链接,并将 当最后一次引用时最终从文件系统中删除 它已关闭。

如果程序意外崩溃,这当然可能是一个问题,因此您可以通过额外使用锁定文件来解决这个问题。

另一种替代方法是使用抽象套接字地址。这是通过将 sun_pathsockaddr_un 的第一个字节设置为 0 并将其余字节设置为指定套接字名称的空终止字符串来完成的。例如:

struct sockaddr_un sun;
sun.sun_family = AF_UNIX;
sun.sun_path[0] = 0;
strcpy(sun.sunpath + 1,"mysocketname");

这会为您提供一个命名套接字,而文件系统中没有相应的套接字文件。一旦套接字描述符关闭,此套接字将自动消失,因此可以使用该名称打开另一个套接字。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。