想象一个 C 语言中的 TCP 服务器/客户端。
-
在服务器中,我将 812 字节写入套接字;
-
在客户端中,我只读取了 512 个字节;
-
在客户端中,我写任何东西。
服务器发送的其他 300 个字节会发生什么情况?它们被覆盖了吗?
另外,如何读取缓冲区大小仅为 512 的所有 812 字节?我可以做某种循环吗?我怎么知道 read(( 是否已经读取了服务器发送的所有内容?
服务器发送的其他 300 个字节会发生什么情况?
它们仍然位于客户端套接字的内部缓冲区中,等待客户端的代码读取它们。
它们被覆盖了吗?
不。
另外,如何读取缓冲区大小仅为 512 的所有 812 字节?我可以做某种循环吗?
是的,这正是您必须做的。 您需要多次从套接字读取,直到读取所有 812 字节。 读取将告诉您每次调用时接收多少字节。
我怎么知道 read(( 是否已经读取了服务器发送的所有内容?
套接字无法知道这一点。 您在套接字之上实现的协议需要规定这一点。 对于 TCP,只有 3 个选项:
发送方可以在发送数据本身之前发送数据的大小。 然后,接收器可以先读取大小,然后继续读取,直到收到指定的数据量。
发送方可以在发送数据后发送唯一的终止符。 接收器可以继续读取,直到收到终结器。
发送方可以关闭连接。 然后,接收器可以继续读取,直到检测到闭合。
行为取决于套接字是阻塞还是非阻塞。 阻止将等到收到数据。 操作系统将缓冲一定数量的数据等待您读取它,一旦数据已满,服务器将阻止等待缓冲区有空间或返回 -1 EWILLBLOCK 错误返回。 发送的数据将在那里等待,直到客户端读取它。 通常,您希望循环阅读,直到获得所需的内容。