读取的内容少于在套接字中写入的内容

问题描述 投票:-2回答:2

想象一下用C编写的TCP服务器/客户端。想象:

1)在服务器中,我向套接字写入了812个字节;

2)在客户端中,我仅读取512个字节;

3)在客户端,我写任何东西。

服务器发送的其他300个字节会怎样?他们被覆盖了吗?

而且,我如何读取全部812个字节,并且缓冲区大小仅为512?我可以做一个循环吗?我如何知道read()是否已读取服务器发送的所有内容?

谢谢!

c sockets client buffer
2个回答
0
投票

行为取决于套接字是阻塞的还是非阻塞的。阻塞将等待,直到接收到数据。操作系统将缓冲一定数量的数据,等待您读取它,一旦该数据已满,服务器将阻止等待该缓冲区有空间,或者返回-1 EWOULDBLOCK错误。发送的数据将在那里等待,直到客户端读取它为止。通常,您需要循环阅读,直到获得所需的内容为止。


0
投票

服务器发送的其他300字节怎么办?

它们仍然坐在客户端套接字的内部缓冲区中,等待客户端的代码读取它们。

它们被覆盖了吗?

编号

而且,我如何读取全部812个字节,并且缓冲区大小仅为512?我可以做一个循环吗?

是的,这正是您要做的。您将需要多次从套接字读取,直到已读取所有812字节。读取将告诉您每次调用时接收到多少字节。

我怎么知道read()是否已读取服务器发送的所有内容?

The socket没有办法知道。您在套接字顶部实现的protocol需要说明这一点。对于TCP,只有3个选项:

  1. 发送方可以先发送数据的大小,然后再发送数据本身。然后,接收器可以先读取大小,然后继续读取直到收到指定数量的数据。

  2. 发送方在发送数据后可以发送唯一的终止符。接收者可以继续阅读,直到接收到终止符。

  3. 发件人可以关闭连接。然后,接收器可以继续阅读,直到检测到关闭为止。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.