我只是在 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()
从中弹出数据的底层输入缓冲区?