c++ - 如何避免重复使用socket?

标签 c++ c linux sockets

有服务器,就有客户端。客户端连接到服务器。服务器函数“accept”返回套接字连接的客户端。但当客户端socket失效时,可以重新使用。如何防止服务器重复使用同一个套接字? P.S.:对于投反对票的粉丝请注意,我不是在询问套接字服务器,而是在询问客户端套接字。

最佳答案

这只是为了澄清一些误解 - 我仍然投票支持关闭该问题,除非将其编辑为合理的内容。

But when the client socket becomes invalid, it can be reused

不,如果 TCP 连接已关闭,则必须关闭套接字文件描述符。稍后可以为新的 TCP 连接分配新的套接字,并接收具有相同整数值的文件描述符,但它不是同一个套接字。

The socket - this is not just a port, but also the address.

不,套接字是进程用来与操作系统谈论 TCP 连接的句柄,它本身由由两个端口和两个地址组成的 4 元组唯一标识。请参阅this answer ,我不打算将其全部粘贴到此处。

If no connection, then the customer will not be aware of this [closing a socket]

如果没有连接,则无需关闭任何内容。

如果存在现有的 TCP 连接,并且客户端或服务器关闭其套接字,另一端将收到通知,并且另一端的套接字也将变为无效(并且应该作为响应关闭)。

For example, socket have parameters SO_REUSEADDR and SO_REUSEPORT. Why would they?

当您关闭连接时,您会发送一个数据包,告诉连接的另一端您已完成此操作。即使他们确认了这一点,如果它们采用不同的网络路径,您也可以在同一连接上接收其他数据包。因此,TCP 将关闭的连接保持在 TIME_WAIT 状态,防止另一个连接在同一地址:端口元组上启动,持续一段任意时间,直到它不太可能收到真正用于前一个连接的数据包。

这个任意的 TIME_WAIT 持续时间是 4 分钟,这很容易足够长,例如,您可以杀死一个服务器进程,然后重新启动它(此时它将无法绑定(bind)到其地址:端口,因为关闭的连接仍在使用该地址:端口)。

SO_REUSEADDR 允许服务器用新的实时连接替换旧的 TIME_WAIT 连接。

SO_REUSEPORT 允许多个套接字绑定(bind)到同一端口并接受同一端口以实现负载平衡。

这一切都有记录,例如。在 man page ,这两个选项都与套接字文件描述符值无关。

正如 bolov 在评论中所说,服务器使用这些的原因是你实际上关心服务器绑定(bind)的地址:端口,因为这就是你知道从哪里到达它的方式。客户端连接的本地端口通常是从临时端口范围分配的,没有人关心它的值是什么,除了它在那一刻是唯一的。

关于c++ - 如何避免重复使用socket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35058474/

相关文章:

c - 在 RAD Studio XE3 中按字母顺序对二维字符数组进行排序

linux - 如何只显示 Docker 容器中分配的资源?

C Pthread : Kill other threads gracefully through one thread

Linux 多播 sendto() 性能因本地监听器而降低

c++ - 为什么 std::istream::read 不根据读取的字节移动文件指针

c++为什么在有关字符串的教程中使用字符数组?

c - C 语言的 GPA 计算器不起作用。可能是类型转换错误

c++ - STL算法删除容器中的所有对象?

c++ - clang_complete vim 扩展不适用于 STL

c - MC9S12上的SCI无法接收数据