工作期间遇到过socket缓存相关的一些问题,有做相关的测试,也有一些比较浅显的体会,今天突然看到下面这篇帖子,是基于windows的socket buffer的,看了下觉得自己当时的理解有点偏,也不确定这里说的是否完全正确,赶紧收藏了,以提醒自己有时间了集中研究一下。
将持续更新!
以下转载自【http://www.cnblogs.com/dawen/archive/2011/05/18/2050330.html】
关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的;我打个很简单的比方,如果你调用socket send函数时;
如果是阻塞模式下:
send先比较待发送数据的长度len和套接字s的发送缓冲的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么 send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小,send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余空间大小send就仅仅把buf中的数据copy到剩余空间里
如果是非阻塞模式下:
在调用socket send函数时,如果能写到socket缓冲区时,就写数据并返回实际写的字节数目,当然这个返回的实际值可能比你所要写的数据长度要小些(On nonblocking stream oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both the client and server computers),如果不可写的话,就直接返回SOCKET_ERROR了,所以没有等待的过程
本文详细解析了Windows环境下socket的阻塞与非阻塞模式的区别及其实现原理。通过对比两种模式下的send函数行为,阐述了在不同模式下数据发送的流程与特点。
547

被折叠的 条评论
为什么被折叠?



