【发布时间】:2021-03-05 12:22:54
【问题描述】:
我正在尝试理解以下code。如果我与该服务器有 50 个连接,并且我通过这些套接字之一发送数据,则带有内部循环的 select 块将捕获我发送的内容并将其回显。但是,如果在第一条消息的很短的时间内,我发送了另一条消息,会发生什么?如此之快,以至于内部循环(在select 之后 - 遍历所有活动客户端套接字的循环)没有完成。这些数据会被丢弃吗?下一个select 会被触发吗?如果我在内循环完成之前发送两条消息会发生什么?我是否会遇到这样的情况:在循环内迭代所有活动套接字时,我得到超过 1 个具有“活动”的套接字 - 即:两个 FD_ISSET(sd, &readfds) 在循环的单次迭代中是否为真?
【问题讨论】:
-
假设
select()实现正确,最好使用非阻塞套接字,不会丢失数据,所有数据都会收到。 -
编辑注意:严格来说,这既不是 C 也不是 C++ 问题,它是 POSIX 或 BSD 网络问题。但是OP的意思是C++,而且网站是关于“C/C++”的,所以保留原来的语言标签是有道理的。
-
@user4815162342 已记录。错误地标记 c 或 c++ 的问题是如此普遍,以至于我没有意识到。应该多加注意
-
@idclev463035818 不用担心 - 这个问题 在技术上是错误的,所以我的评论更像是对 OP 的宽大处理,而不是对编辑的批评。
-
请注意,在现代操作系统的新程序中,
poll通常优于select。
标签: c++ sockets unix select tcp