C 如何在本地套接字关闭后重新绑定它?

C 如何在本地套接字关闭后重新绑定它?,c,linux,sockets,unix-socket,C,Linux,Sockets,Unix Socket,如果unix套接字绑定到路径,listen()s并执行一些工作,然后关闭,则套接字“文件”将保留在文件系统中。但是如果我尝试connect()到该路径,我会 Connect errno:111 Connection refused 那么“神器”之后还剩下什么呢?它仍然是文件系统上的一个inode(我可以用ls看到它),但是它没有绑定,没有侦听,我不能cat它,否则我会得到它 cat: /tmp/unix.str: No such device or address 那么,inode还剩下什么

如果unix套接字绑定到路径,
listen()
s并执行一些工作,然后关闭,则套接字“文件”将保留在文件系统中。但是如果我尝试
connect()
到该路径,我会

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

cat: /tmp/unix.str: No such device or address
那么,
inode
还剩下什么呢?我怎样才能使那个“工件”再次活跃起来,绑定并监听套接字(而不移除它,并用那个路径创建新的套接字)

  • “死”本地套接字的用途是什么(为什么它在关闭后不移除,而不再使用它)

  • 我怎样才能恢复“死亡”插座?(主要问题)

  • 谁对错误
    连接被拒绝负责
    ?没有被
    bind()
    ed或者没有
    listen()
    ing

  • 您在尝试连接时会收到“连接被拒绝”,因为本地套接字上没有任何内容正在侦听。这与您尝试连接到TCP套接字(如果没有侦听该端口号)的情况相同

    打开套接字的程序关闭后,该进程负责在
    取消链接的情况下删除文件。各国:

    绑定到具有文件名的套接字将在 调用方必须删除的文件系统 需要更长时间(使用取消链接(2))。通常的UNIX紧随其后 语义应用;插座可以在任何时候解除链接,并且 当最后一次引用 关门了

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

    另一种选择是使用抽象套接字地址。这是通过将
    sockaddr\u un
    中的
    sun\u path
    的第一个字节设置为0,将其余字节设置为指定套接字名称的以null结尾的字符串来完成的。例如:

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

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

    我无法重新绑定本地套接字,如果它存在(
    bind errno:98;Address ready in use
    ),因此我必须先
    取消链接()
    ,旧的(死的)套接字,之后,我可以重新绑定并再次聆听这条路径。但这就是问题所在,“死”套接字的用途是什么,我如何才能恢复死套接字(使其再次侦听),而不必
    取消链接()
    @milanHrabos查看我的编辑。它必须是
    unlink
    ”ed。因此抽象套接字不是作为文件系统上的
    inode
    创建的吗?如果否,如何引用“抽象”(不在文件系统上)呢?它的数据是如何缓冲的?如果不是常规inode?@milanHrabos文件系统中的套接字描述符不是包含缓冲数据的实际文件。它只是指向内核中管理所有这些的数据结构的指针。具有抽象地址的套接字是相同的,只是没有相应的外部文件。创建套接字(可能通过
    socket()
    函数)后,调用
    setsockopt()
    ,即
    int enable=1;if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&enable,sizeof(int))<0)错误(“setsockopt(SO_REUSEADDR)失败”)然后可以重用套接字。