本文主要是介绍closesocket,shutdown区别 recv,send意义 CLOSE_WAIT影响,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
http://blog.csdn.net/yby4769250/article/details/7296859
区分 WinSock中,closesocket 和 shutdown的作用
如果是shutdown(SD_SEND)则会发送FIN包,这是对协议层产生的影响,此时,协议层会首先把缓冲区中的数据发送出去,最后再发送FIN包,次称为‘从容关闭’或者‘优雅关闭’。
而closesocket虽然也会发送FIN包,但是,此时会丢弃掉缓冲区中的数据,导致数据丢失,此称为‘强制关闭’,并且closesocket会使连接释放,并且,系统会释放与该socket相关的资源
http://blog.csdn.net/yby4769250/article/details/7296860
recv和send的真正作用
区分应用层的recv,send和内核中套接字的真正读取数据,要知道,TCP协议层是运行与内核当中,而通信是网卡直接的通信,因此,不要认为,没有调用recv就不会有数据,不管调没调用recv,只要对方send,线路上有数据,那么,协议就会从网卡里面读取该数据进内核的socket缓冲区中,而调用recv的真正作用只是把数据从socket内核缓冲区中把数据拷贝到应用层指定的buffer中,仅此而已,对协议完全没影响,同理,因为socket默认是全缓冲,如果没有setsocketopt的话,只有当socket内核缓冲区中的数据满了之后才会执行真正的发送数据,才会把数据从socket 的缓冲区中通过网卡把数据发送出去,其实就是执行真正的IO操作一样,因此,send的操作,只是把应用层的数据拷贝到socket的缓冲区中而已,并不表示把数据发送出去了,明白这几点。
http://blog.csdn.net/yby4769250/article/details/7296858
CLOSE_WAIT的产生以及影响和解决方案
今天,做了CoolDown的测试时才发现,C/S架构中,如果服务器先执行主动关闭,则非常有可能导致客户端的socket一直处于CLOSE_WAIT状态,相应的导致服务器端的socket一直处于FIN_WAIT2状态,愿意是,当服务器端执行主动关闭时,发送FIN包,客户端相应ACK,,这个时候,服务器端进入FIN_WAIT2,而客户端进入CLOSE_WAIT状态,如果这个时候,客户端不执行shutdown(SD_SEND)的话,无法给服务器端发送FIN包,则两端的状态都一直不变,这个时候导致关闭一场,socket连接永远无法释放,占用系统资源,所以,一定要注意这点
这篇关于closesocket,shutdown区别 recv,send意义 CLOSE_WAIT影响的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!