我编写了一个简单的C套接字程序,它将一个INIT包发送到服务器以指示准备文本传输。此时服务器不会发回任何数据。 发送INIT包后,客户端发送GET包并等待来自服务器的数据块。 因此,每次服务器收到GET包时,它都会向客户端发送一大块数据。
到目前为止一切顺利。缓冲区的大小为512字节,块大小为100字节加上一点点开销。
但我的问题是客户端没有收到第二条消息。
所以我的猜测是read()将一直闪烁直到缓冲区已满。这是对的还是可能的原因?
答案 0 :(得分:1)
这取决于。对于TCP套接字read
可能在缓冲区已满之前返回,并且您可能需要在循环中接收以获取整个消息。对于UDP套接字,您读取的大小通常是单个数据包(数据报)的大小,然后read
可能会阻塞,直到它读取了所有请求的数据。
答案 1 :(得分:1)
答案是否定的:tcp / ip套接字上的read()
在缓冲区已满之前不会阻塞。如果有任何数据可用,read()
将在所有情况下立即返回,即使您的套接字阻塞并且您请求的数据超出可用数据。
请记住,TCP / IP是一种字节流协议,您必须将其视为字节流协议。只要按照您将数据放入套接字的顺序呈现给您,接口就没有义务将您的数据一起传输到一个数据包中。
答案 2 :(得分:-3)
答案是否定,读取不阻止呼叫,您可以参考以下几点来猜测错误
您可以找到几个检查点:
确保所有三个都存在。如果问题尚未解决。请在此处发布源代码