c - 您如何在可以在另一个线程上关闭的套接字上优雅地选择()?

标签 c sockets

我有这样一种情况,线程正在选择由单独线程管理的套接字。

当一个套接字关闭时,select() 大概会将该套接字返回为“可用”,直到我尝试读取它时我才意识到它已关闭。

但我看到了一个悖论:当套接字从另一个线程关闭时,系统可以自由地重新分配其文件描述符以用于其他目的。 (我认为。)

我如何保证在我从套接字(只是一个数字描述符)读取时系统尚未回收该描述符并将其用于新套接字?换句话说,据我所知,我可能正在从最近打开的一些其他套接字(也许我什至不应该包括在我的 select() 中的套接字!)而不是刚刚打开的套接字读取-关闭套接字。

我可以保留最近关闭的描述符列表,但我想知道是否有更好的方法。

最佳答案

简短的回答:不要关闭您正在阅读的另一个线程的套接字!

FD 可能会被重新分配。但是如果您在多个线程中从一个 FD 读取而没有某种方案在它们之间进行通信,您将会遇到问题。现在,如果你在共享内存中有一个“套接字描述”结构,它有一个控制信号量和 FD 的一些指示,以及其他状态信息,也许这是可以管理的,但我认为你会发现最简单的解决方案几乎是始终使 FD 特定于单个线程……

关于c - 您如何在可以在另一个线程上关闭的套接字上优雅地选择()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8480381/

相关文章:

c - 在什么情况下 libgit2 比 git 快?

c# - 嵌入式系统: Sockets vs MSMQ

php - 连接两个套接字服务器的最佳方式(node.js 和 Ratchet php)

c++ - 以编程方式查询 Linux 机器的电源状态

node.js - 如何在多个 Node js服务器之间发出消息

java - 避免 SocketTimeoutException 的最佳方法是什么?

Node.js 写入后刷新套接字

c++ - 将 int[][] 分配给 int**

c - 在 c 中打印结构数组时遇到问题

c - Windows Defender/安全性删除我的 “hello world”程序