读取(套接字)阻塞直到缓冲区已满?

时间:2015-10-14 10:49:35

标签: c sockets

我编写了一个简单的C套接字程序,它将一个INIT包发送到服务器以指示准备文本传输。此时服务器不会发回任何数据。 发送INIT包后,客户端发送GET包并等待来自服务器的数据块。 因此,每次服务器收到GET包时,它都会向客户端发送一大块数据。

到目前为止一切顺利。缓冲区的大小为512字节,块大小为100字节加上一点点开销。

但我的问题是客户端没有收到第二条消息。

所以我的猜测是read()将一直闪烁直到缓冲区已满。这是对的还是可能的原因?

3 个答案:

答案 0 :(得分:1)

这取决于。对于TCP套接字read可能在缓冲区已满之前返回,并且您可能需要在循环中接收以获取整个消息。对于UDP套接字,您读取的大小通常是单个数据包(数据报)的大小,然后read可能会阻塞,直到它读取了所有请求的数据。

答案 1 :(得分:1)

答案是否定的:tcp / ip套接字上的read()在缓冲区已满之前不会阻塞。如果有任何数据可用,read()将在所有情况下立即返回,即使您的套接字阻塞并且您请求的数据超出可用数据。

请记住,TCP / IP是一种字节流协议,您必须将其视为字节流协议。只要按照您将数据放入套接字的顺序呈现给您,接口就没有义务将您的数据一起传输到一个数据包中。

答案 2 :(得分:-3)

答案是否定,读取不阻止呼叫,您可以参考以下几点来猜测错误

您可以找到几个检查点:

  1. 找出第二次读回的内容。
  2. 每次在recv之前记录缓冲区
  3. 如果无法输出,请使用fflush(stdout)。
  4. 确保所有三个都存在。如果问题尚未解决。请在此处发布源代码