首先,解释一下动机的一点背景:我正在开发一个非常简单的基于 select() 的 TCP“镜像代理”,它允许两个防火墙客户端间接地相互通信。两个客户端都连接到该服务器,一旦两个客户端连接,客户端 A 发送到服务器的任何 TCP 字节都会转发到客户端 B,反之亦然。
这或多或少是有效的,有一个小问题:如果客户端 A 连接到服务器并在客户端 B 连接之前开始发送数据,则服务器没有任何地方可以放置数据。我不想在 RAM 中缓冲它,因为这最终可能会使用大量 RAM;而且我也不想只删除数据,因为客户端 B 可能需要它。所以我选择第三个选项,即在客户端 B 也连接之前,不要在客户端 A 的套接字上进行 select()-for-read-ready。这样,客户端 A 就会阻塞,直到一切准备就绪。
这或多或少也有效,但是在客户端 A 的套接字上未选择读取就绪的副作用是,如果客户端 A 决定关闭与服务器的 TCP 连接,则服务器不会收到有关该事实的通知 - - 至少,直到客户端 B 出现并且服务器最终在客户端 A 的套接字上选择读取准备就绪,读取任何未决数据,然后获得套接字关闭通知(即 recv() 返回 0)。
如果服务器有某种方式(及时)知道客户端 A 何时关闭了他的 TCP 连接,我会更喜欢它。有没有办法知道这一点?在这种情况下轮询是可以接受的(例如,如果存在这样的函数,我可以让 select() 每分钟唤醒一次并在所有套接字上调用 IsSocketStillConnected(sock))。