我只是在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()
正在从?
答案 0 :(得分:4)
套接字的实现(在内核中)会自动为您处理。
只要它是TCP套接字,您就不会丢失数据。如果它是UDP套接字,如果缓冲区溢出,则可能会丢失数据。