gpt4 book ai didi

c - 关闭后如何重新绑定(bind)本地套接字?

转载 作者:行者123 更新时间:2023-12-03 09:53:21 25 4
gpt4 key购买 nike

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

Connect errno:111
Connection refused

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

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

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

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

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

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

最佳答案

尝试连接时出现“连接被拒绝”,因为本地套接字上没有任何内容在监听。这就像您尝试建立到 TCP 套接字的连接一样,如果没有任何东西在该端口号上监听。

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

Binding to a socket with a filename creates a socket in thefilesystem that must be deleted by the caller when it is nolonger needed (using unlink(2)). The usual UNIX close-behindsemantics apply; the socket can be unlinked at any time and willbe finally removed from the filesystem when the last reference toit is closed.

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

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

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

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

关于c - 关闭后如何重新绑定(bind)本地套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65959936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com