TCP与UDP的Send和Recv

来源:互联网 发布:ec软件是什么 编辑:程序博客网 时间:2024/05/16 04:35
腾讯面试题
Linux Socket TCP Recv的返回值>0是表示从接收缓冲区实际Copy了这么多个字节的数据出来,也就是表示系统已实际收到发送方发过来的这么多个数据或者更多的数据.返回值为0则表示服务器已主动断开连接,也就是已收到了服务器发过来的Fin或者Rst.若返回值等于-1的话,且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN),则表示接收缓冲区已无数据可读,但连接是正常的,可以稍后再尝试读.否则表示连接发生异常,连接已断开,无效描述符之类的.

Linux Socket TCP Send的返回值>0是表示已经发送了的字节数(未被确认的),例如要发送10个字节,在异步模式下返回值为5个字节,则表示已经Copy了5个字节到发送缓冲区,系统随后会发送这些数据,但这5个字节是未被确认的,也就是还没收到接收方的Ack,如果服务器无回应或网络断开,那么系统将会不断重发该数据包,直到收到这5个字节的Ack.而剩下的5个未发的字节则由应用程序调用Send再发.若返回值为0则表示服务器已主动断开连接,也就是已收到了服务器发过来的Fin或者Rst.若返回值等于-1的话,并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN),则表示系统在忙或者发送缓冲区已满了,但连接是正常的,可以稍后再尝试发.否则表示连接发生异常,连接已断开,无效描述符之类的.

UDP的sendto对应着recvfrom,一发一收.如果sendto的数据大于MTU,则会在IP层分片发送,到达目标后由IP层重组,再从recvfrom一次性返回.如果使用IP层分片重组则存在乱序,丢包,重包的问题.调用一次sendto,只要数据长度小于MTU都会以一个独立的UDP包发送.recvfrom的接收大小必须大于或等于sendto时的是数据大小.更正确的说法应该是UDP的包单位是以IP层的包为单位的.

原创粉丝点击