我在使用 c++ 的 select 实现服务器同时连接多个客户端,出现的情况是有的时候 FD_ISSET 可以监测处哪些 socket 可读,有的时候虽然所有 socket 用 FD_ISSET 都返回 0,但是客户端是发送了数据过来的。如果读取 socket,是可以读到客户端发的内容,但是 FD_ISSET 和 select 函数并不会标记该 socket 为可读。
当我用多个客户端和服务器向服务器发信息的时候,一般是前几次所有 socket 都可以正常检测出可读的 socket,逐渐的,可检测出的可读 socket 越来越少,直到所有 socket 都被认为是不可读。
不知道有没有哪位大佬知道原因。我现在用 macOS 写代码,调用的并不是 FD_ISSET 而是 __DARWIN_FD_ISSET,不知道和这个有没有关系。
顺便问一下,FD_ISSET 的值是什么时候更新的?我在读 socket 前后各返回了 FD_ISSET,返回的是相同的值(该值表示 socket 可读)。所以是在执行 select 时候更新的吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.