【发布时间】:2015-10-14 10:49:34
【问题描述】:
我编写了一个简单的 C 套接字程序,它向服务器发送一个 INIT 包以指示准备文本传输。服务器当时不会发回任何数据。 发送 INIT 包后,客户端发送一个 GET 包并等待来自服务器的数据块。 所以每次服务端收到一个 GET 包,它都会向客户端发送一大块数据。
到目前为止一切顺利。缓冲区大小为 512 字节,一个块为 100 字节加上一点开销大。
但是我的问题是客户端没有收到第二条消息。
所以我的猜测是 read() 将 blpck 直到缓冲区已满。这是正确的还是可能是什么原因?
【问题讨论】:
-
不,
read()会读取所有内容。它只会在阻塞模式下阻塞,当没有数据并且没有其他事件挂起时。 -
谢谢。那么可能是什么问题?会不会是第二条消息发送得太快了?
-
没有。即使它是在客户端发送数据之前发送的,您也可以读取它,因为这是流套接字的操作方式。可能是这样,服务器没有收到完整的请求,因此没有发送响应。例如,在 HTTP 协议中,服务器在读取所有请求标头 + 换行符之前不会开始回复。所以检查那部分。
-
所以我必须添加一个特殊的字符,比如\n吗?我没有。
-
如果使用 HTTP,请求的结尾是两个 '\n' 字符(形成一个空行)。我不建议您实现自己的 HTTP 堆栈。改用一些现有的库。 HTTP 协议有点繁琐,并且有很多细微差别。否则,请阅读w3.org/Protocols/rfc2616/rfc2616.txt