昨天面试遇到的一个选择题,关于send和recv函数的。其中两个选项是:
1. send函数返回成功,表示数据一定可以传送给对方。
2. 用两次send函数发送两次数据,一次recv函数有可能全部收到。
当时是不知道对错的,现在看了一下这两个函数的一些资料,才知道1是错的,2是对的。
send函数:
send函数做的工作是把要发送的数据copy到发送缓冲区中,copy完成后返回,协议来负责将数据从缓冲区发送到另一端的接收缓冲区。
如果发送的数据长度len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么 send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余 空间大小send就仅仅把buf中的数据copy到剩余空间里。
recv函数:
recv函数负责将数据从接收缓冲区中copy出来,而真正的接收数据的阶段是协议完成的。
当应用程序调用recv函数时,recv先等待s的发送缓冲 中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到 协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy出来。