- 论坛徽章:
- 0
|
以下实验在windows下作,
实验一:网上有种说法:“阻塞模式下直接使用套接字接收或者发送,如果通信的对端关闭连接或者对端进程崩溃,则这边的recv函数就会长时间不返回值
”,但是我实际编了个程序测试了阻塞模式下的recv,发现在对端关闭连接就马上返回0,如果对端进程崩溃,则recv马上返回 < 0; 而且都是立即就能返回,
实验二:拔网线断网,如果建立的长连接,分拨的是自己机子的网线还是拔得是对端的网线两种情况,仅仅把自己的机子网线拔掉,自己机子的recv需要几秒钟能返回,无论是select模式还是阻塞模式都是如此, 仅仅拔掉远端机子的网线,本机这端的网线不动,则本机的recv套接子,无论是select还是阻塞模式,都无法感知远端网线是否拔掉,拔对端的网线,得靠对端自己的recv,能在几秒钟后感知,本地机子不可能感知远端的网线拔掉,这个和远端程序崩溃不一样,远端程序崩溃,本地机子recv马上就能返回,无论是select还是阻塞模式,我做实验得出的结论
我的结论: 1 我觉得所谓”阻塞模式下直接使用套接字接收,一旦通信对方关闭或者进程崩溃,不能马上返回对端这些异常,只有selcet模式可以马上返回异常,“这说法是错误的!两者都可以 马上返回值,但两种方式都不能感受到远端的网线是否拔掉,两者都可以在自己机子的网线拔掉后几秒钟感知到
结论2 :一个套接字情况下,select模式和直接阻塞模式使用套接字相比,优势只体现在select是异步模式,可以发,收分开,而直接阻塞模式,如果要一问一答,则只能同步,即:发完后等到对方应答后才能再发。对“马上感知对端通信异常(指对端套接字关闭,对端进程崩溃)”而言, 两者效果一样!(当然,如果通信双方使用>=2个的套接子通信,select还是比仅仅使用两个都阻塞模式的套接字的优势多了起来,不再赘述)
请高人指教,我上述两点是否正确?多谢! |
|