3

我只是在 C 中学习套接字/网络编程,并且遇到了recv()函数导致一些意外行为的情况(至少对我来说是意外的)。

我有一个设置了套接字的服务器程序,并且recv()像这样调用:

bytes_received = recv(connected, recv_data, 5, 0); 

recv_data是一个 5 字节的缓冲区。

我的客户端程序用于send()发送数据,它的发送缓冲区是 1024 字节,但由于它是从标准输入读取的,所以在这个实验中我只给了它 1-10 个字节(字符)。

我看到即使我的recv()调用使用 5 字节缓冲区并施加 5 字节的限制,我仍然可以发送超过 5 个字节,而且它似乎只是在服务器端的某个地方排队,这样下一次recv()被调用(例如在一个循环中),它接收接下来的 5 个字节的传入数据。

我的理解是,它send()会触发它的数据(假设所有 12 个字节),但由于recv()只是“设置”来处理 5 个字节,所以最后的 7 个字节会丢失。服务器从哪里获取这些信息?套接字级别是否存在recv()从中弹出数据的底层输入缓冲区?

4

1 回答 1

4

套接字的实现(在内核中)会自动为您处理这个问题。

只要它是 TCP 套接字,您就不会丢失数据。如果它是 UDP 套接字,如果缓冲区溢出,您可能会丢失数据。

于 2013-03-04T01:43:10.057 回答