有一台服务器,有客户端。客户端连接到服务器。服务器功能"接受"返回socket连接客户端。但是当客户端套接字变为无效时,它可以被重用。如何防止服务器重用同一个套接字? P.S。:对于粉丝downvote注意,我不询问套接字服务器,我问一个客户端套接字。
答案 0 :(得分:2)
这只是为了澄清一些误解 - 我仍然投票支持要关闭的问题,除非它被编辑成合情合理的东西。
但是当客户端套接字无效时,可以重复使用
不,如果TCP连接已关闭,则必须关闭套接字文件描述符。稍后可以为新的TCP连接分配新的套接字,并接收具有相同整数值的文件描述符,但它不是相同的套接字。
套接字 - 这不仅仅是一个端口,还有地址。
不,套接字是你的进程用来与操作系统讨论TCP连接的句柄,TCP连接本身由4个元组唯一标识,由4个元组组成,包括两个端口和两个地址。请参阅this answer,我不打算将其全部粘贴在这里。
如果没有连接,那么客户将不会知道[关闭套接字]
如果没有连接,则无法关闭。
如果存在TCP连接,并且客户端或服务器关闭其套接字,则另一端将被通知,另一端的套接字也将变为无效(并应作为响应关闭)。
例如,socket具有参数SO_REUSEADDR和SO_REUSEPORT。他们为什么会这样?
当您关闭连接时,您会发送一个数据包,告知您已完成连接的另一端。即使他们已经确认了这一点,如果他们采用不同的网络路径,您也可以在同一连接上接收其他数据包。因此,TCP将关闭连接保持在TIME_WAIT状态,防止另一个连接从同一地址:port tuple开始,持续一段时间,直到它不太可能收到真正用于先前连接的数据包。
这个任意的TIME_WAIT持续时间是4分钟,这很容易够长,以至于您可以杀死服务器进程然后重新启动它(此时它将无法绑定到其地址:port,因为关闭的连接仍在使用该地址:port)。
SO_REUSEADDR允许服务器用旧的实时连接替换旧的TIME_WAIT连接。
SO_REUSEPORT允许多个套接字绑定到同一端口并在其上接受,以实现负载平衡。
这些都记录在案,例如。在man page中,两个选项都与套接字文件描述符值无关。
正如bolov在评论中所说,服务器使用这些服务器的原因是你实际上关心地址:服务器绑定的端口,因为这就是你知道到达目的地的方式。客户端连接的本地端口通常是从临时端口范围分配的,没有人关心它的值是什么,除了它在那个时刻是唯一的。
答案 1 :(得分:-1)
这可以通过创建这样的程序来实现,即服务器不接受socket id
file descriptor被释放。但这可能使操作系统复杂化可能是操作系统可能失败的情况。
file descriptors
,single process
,file table
和inode table
可用。由于每个file descriptor
可能由个人inode
指导。
But在创建文件系统时修复了inodes
的最大数量,限制了文件系统可以容纳的最大文件数。文件系统中inodes
的典型分配启发式算法占总大小的百分之一。
由于indoe table
具有固定的大小,并且释放file descriptor
特定inode
是免费的,但按照您的方式inode table
可能很快就会枯竭并导致系统崩溃