怎么做网站标题优化,上海网站建设与设计,公共服务标准化指南,做的网站不能放视频send()和recv()函数是网络编程中经常使用到的函数#xff0c;下面详细的比较两者的不同之处
send函数工作原理#xff1a;send函数只负责将数据提交给协议层。 当调用该函数时#xff0c;send先比较待发送数据的长度len和套接字s的发送缓冲区的长度#xff0c;如果len大于s…send()和recv()函数是网络编程中经常使用到的函数下面详细的比较两者的不同之处
send函数工作原理send函数只负责将数据提交给协议层。 当调用该函数时send先比较待发送数据的长度len和套接字s的发送缓冲区的长度如果len大于s的发送缓冲区的长度该函数返回SOCKET_ERROR 如果len小于或者等于s的发送缓冲区的长度那么send先检查协议是否正在发送s的发送缓冲中的数据 如果是就等待协议把数据发送完如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据那么send就比较s的发送缓冲区的剩余空间和len 如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完如果len小于剩余空间大小send就仅仅把buf中的数据copy到剩余空间里注意并不是send把s的发送缓冲中的数据传到连接的另一端的而是协议传的send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里。 如果send函数copy数据成功就返回实际copy的字节数如果send在copy数据时出现错误那么send就返回SOCKET_ERROR 如果send在等待协议传送数据时网络断开的话那么send函数也返回SOCKET_ERROR。要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了但是此时这些数据并不一定马上被传到连接的另一端。 如果协议在后续的传送过程中出现网络错误的话那么下一个Socket函数就会返回SOCKET_ERROR。每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续如果在等待时出现网络错误那么该Socket函数就返回SOCKET_ERROR recv函数工作原理recv先检查套接字s的接收缓冲区如果s接收缓冲区中没有数据或者协议正在接收数据那么recv就一直等待直到协议把数据接收完毕。当协议把数据接收完毕recv函数就把s的接收缓冲中的数据copy到buf中注意协议接收到的数据可能大于buf的长度所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据真正的接收数据是协议来完成的recv函数返回其实际copy的字节数。如果recv在copy时出错那么它返回SOCKET_ERROR如果recv函数在等待协议接收数据时网络中断了那么它返回0 。对方优雅的关闭socket并不影响本地recv的正常接收数据如果协议缓冲区内没有数据recv返回0指示对方关闭如果协议缓冲区有数据则返回对应数据(可能需要多次recv)在最后一次recv时返回0指示对方关闭。要点在进行TCP协议传输的时候要注意数据流传输的特点recv和send不一定是一一对应的一般情况下是一一对应也就是说并不是send一次就一定recv一次就接收完有可能send一次recv多次才接收完也可能send多次一次recv就接收完了。TCP协议会保证数据的有序完整的传输但是如何去正确完整的处理每一条信息是程序员的事情。例如服务器在循环recvrecv的缓冲区大小为100byte客户端在循环send每次send 6byte数据则recv每次收到的数据可能为6byte12byte18byte这是随机的编程的时候注意正确的处理。