C 如何在本地套接字关闭后重新绑定它?
如果unix套接字绑定到路径,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还剩下什么
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
取消链接的情况下删除文件。各国:
绑定到具有文件名的套接字将在
调用方必须删除的文件系统
需要更长时间(使用取消链接(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)失败”)代码>然后可以重用套接字。