想象一下用C编写的TCP服务器/客户端。想象:
1)在服务器中,我向套接字写入了812个字节;
2)在客户端中,我仅读取512个字节;
3)在客户端,我写任何东西。
服务器发送的其他300个字节会怎样?他们被覆盖了吗?
而且,我如何读取全部812个字节,并且缓冲区大小仅为512?我可以做一个循环吗?我如何知道read()是否已读取服务器发送的所有内容?
谢谢!
行为取决于套接字是阻塞的还是非阻塞的。阻塞将等待,直到接收到数据。操作系统将缓冲一定数量的数据,等待您读取它,一旦该数据已满,服务器将阻止等待该缓冲区有空间,或者返回-1 EWOULDBLOCK错误。发送的数据将在那里等待,直到客户端读取它为止。通常,您需要循环阅读,直到获得所需的内容为止。
服务器发送的其他300字节怎么办?
它们仍然坐在客户端套接字的内部缓冲区中,等待客户端的代码读取它们。
它们被覆盖了吗?
编号
而且,我如何读取全部812个字节,并且缓冲区大小仅为512?我可以做一个循环吗?
是的,这正是您要做的。您将需要多次从套接字读取,直到已读取所有812字节。读取将告诉您每次调用时接收到多少字节。
我怎么知道read()是否已读取服务器发送的所有内容?
The socket没有办法知道。您在套接字顶部实现的protocol需要说明这一点。对于TCP,只有3个选项:
发送方可以先发送数据的大小,然后再发送数据本身。然后,接收器可以先读取大小,然后继续读取直到收到指定数量的数据。
发送方在发送数据后可以发送唯一的终止符。接收者可以继续阅读,直到接收到终止符。
发件人可以关闭连接。然后,接收器可以继续阅读,直到检测到关闭为止。