困惑:socket通信使用阻塞模式,一旦对端进程崩溃或者关闭连接,阻塞模式下的socket 的recv不能马上返回值吗?

响马0709 2013-11-01 12:41:24
网上有种说法:阻塞模式下直接使用套接字接收或者发送,如果通信的对端关闭连接或者对端进程崩溃,则这边的recv函数就会长时间不返回值
,但是我实际编了个程序测试了阻塞模式下的recv,发现在对端关闭连接就马上返回0,如果对端进程崩溃,则recv马上返回 < 0; 而且都是立即就能返回


那么,如果socket通信双方仅用一个套接字发送接收,则select模式和直接阻塞模式使用套接字相比优势在哪里?
我的结论: 1 我觉得所谓”阻塞模式下直接使用套接字接收,一旦通信对方关闭或者进程崩溃,不能马上返回对端这些异常,只有selcet模式可以马上返回异常,“这说法不成立!两者都可以
马上返回值
结论2 :一个套接字情况下,select模式和直接阻塞模式使用套接字相比无优势
(当然,如果通信双方使用>=2个的套接子通信,select还是比仅仅使用两个都阻塞模式的套接字有优势的)
请高人指教,我上述两点是否正确?多谢!满意回复的给分!
...全文
370 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
响马0709 2013-11-21
  • 打赏
  • 举报
回复
2,3楼说得都对,1,4楼也提供了新方法,都给分
max_min_ 2013-11-02
  • 打赏
  • 举报
回复
这个很简单做个试验就好! 然后通过wirekshark抓包看看,是否收到或者发送相关断开,重连等字段!
  • 打赏
  • 举报
回复
设置一下keepalive呀,将tcp保活时限由2小时,调成你需要的时限
帅得不敢出门 2013-11-01
  • 打赏
  • 举报
回复
对方断开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.
赵4老师 2013-11-01
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧