疑惑:socket通信使用阻塞模式,一旦对端进程崩溃或者关闭连接,阻塞模式下的socket 的recv不能马上返回值吗
困惑:socket通信使用阻塞模式,一旦对端进程崩溃或者关闭连接,阻塞模式下的socket 的recv不能马上返回值吗?
网上有种说法:阻塞模式下直接使用套接字接收或者发送,如果通信的对端关闭连接或者对端进程崩溃,则这边的recv函数就会长时间不返回值
,但是我实际编了个程序测试了阻塞模式下的recv,发现在对端关闭连接就马上返回0,如果对端进程崩溃,则recv马上返回 < 0; 而且都是立即就能返回,
那么,如果socket通信双方仅用一个套接字发送接收,则select模式和直接阻塞模式使用套接字相比优势在哪里?
我的结论: 1 我觉得所谓”阻塞模式下直接使用套接字接收,一旦通信对方关闭或者进程崩溃,不能马上返回对端这些异常,只有selcet模式可以马上返回异常,“这说法不成立!两者都可以
马上返回值
结论2 :一个套接字情况下,select模式和直接阻塞模式使用套接字相比无优势
(当然,如果通信双方使用>=2个的套接子通信,select还是比仅仅使用两个都阻塞模式的套接字有优势的)
请高人指教,我上述两点是否正确?多谢!满意回复的给分!
------解决方案--------------------
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
不要写连自己也预测不了结果的代码!
------解决方案--------------------
对方断开socket, recv是会返回0的。
linux:
man recv
RETURN VALUE
These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0 when the peer has performed an orderly
shutdown.
单个且阻塞的连接似乎没什么必要用到select吧。
man select
select() and pselect() allow a program to monitor multiple file descriptors, waiting until one or more of the file descriptors become "ready"
for some class of I/O operation (e.g., input possible). A file descriptor is considered ready if it is possible to perform the corresponding
I/O operation (e.g., read(2)) without blocking.
------解决方案--------------------
设置一下keepalive呀,将tcp保活时限由2小时,调成你需要的时限
------解决方案--------------------
这个很简单做个试验就好!
然后通过wirekshark抓包看看,是否收到或者发送相关断开,重连等字段!
网上有种说法:阻塞模式下直接使用套接字接收或者发送,如果通信的对端关闭连接或者对端进程崩溃,则这边的recv函数就会长时间不返回值
,但是我实际编了个程序测试了阻塞模式下的recv,发现在对端关闭连接就马上返回0,如果对端进程崩溃,则recv马上返回 < 0; 而且都是立即就能返回,
那么,如果socket通信双方仅用一个套接字发送接收,则select模式和直接阻塞模式使用套接字相比优势在哪里?
我的结论: 1 我觉得所谓”阻塞模式下直接使用套接字接收,一旦通信对方关闭或者进程崩溃,不能马上返回对端这些异常,只有selcet模式可以马上返回异常,“这说法不成立!两者都可以
马上返回值
结论2 :一个套接字情况下,select模式和直接阻塞模式使用套接字相比无优势
(当然,如果通信双方使用>=2个的套接子通信,select还是比仅仅使用两个都阻塞模式的套接字有优势的)
请高人指教,我上述两点是否正确?多谢!满意回复的给分!
select 阻塞
套接字
------解决方案--------------------
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
不要写连自己也预测不了结果的代码!
------解决方案--------------------
对方断开socket, recv是会返回0的。
linux:
man recv
RETURN VALUE
These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0 when the peer has performed an orderly
shutdown.
单个且阻塞的连接似乎没什么必要用到select吧。
man select
select() and pselect() allow a program to monitor multiple file descriptors, waiting until one or more of the file descriptors become "ready"
for some class of I/O operation (e.g., input possible). A file descriptor is considered ready if it is possible to perform the corresponding
I/O operation (e.g., read(2)) without blocking.
------解决方案--------------------
设置一下keepalive呀,将tcp保活时限由2小时,调成你需要的时限
------解决方案--------------------
这个很简单做个试验就好!
然后通过wirekshark抓包看看,是否收到或者发送相关断开,重连等字段!