【发布时间】:2016-10-10 01:24:00
【问题描述】:
在 Socket 编程中,无论您是在 C 还是 java 中编写代码,都假设以下情况。
客户端的代码类似于:
while(1) {
read(...);
/* process received msg */
process(received_msg)
}
现在,客户端收到msg1 并忙于处理它。这意味着处理器现在正在process() 中运行一些指令。此时,msg2 到达。但是,现在没有read() 阻止接收它。现在收到的消息msg2 会发生什么?
它取决于协议吗?是否依赖于语言api?
我认为如果我每次收到消息都创建一个新线程,我可以克服这个问题。我的问题旨在了解在单线程上下文中会发生什么,以及是否有任何方法可以在不使用多线程的情况下完成这项工作。
【问题讨论】:
-
内核为你缓冲接收到的数据,以便下次读取时可用。如果内核无法再缓冲以及其他此类情况,内核还会管理发生的情况(取决于协议)。
-
如果你的消息适合套接字的缓冲区,你会在那里找到它。如果缓冲区已满,您的 TCP 堆栈——(因为套接字是流式传输的,因此是 TCP)——将通知发送方保留这些数据包。另请参阅 SO what happens when I write data to a blocking socket, faster than the other side reads?。
-
"如果有任何方法可以在不使用多个线程的情况下完成这项工作。" - 在 单线程同步处理 方法中,如果您的处理器比发送方慢并且您使用 TCP,那么您也会以减慢发送方的速度结束。当多线程不可用时,UNIX-es 会为每个请求派生/派生另一个进程。