与C中的recv()混淆,是否存在底层输入缓冲区?数据来自哪里?

时间:2013-03-04 01:39:25

标签: c sockets network-programming recv

我只是在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()正在从?

弹出数据的基础输入缓冲区

1 个答案:

答案 0 :(得分:4)

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

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