有关select

ylkhao_hao 2009-10-09 03:55:18
使用select来确定一个套接字是否可读,当服务器端停止发送数据,但并不关闭套接字时,为什么该套接字仍然是可读呢?而recv的话接收数据长度为0.我得理解是当有数据到达时才变为可读。难道理解错了?
...全文
75 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dempsey 2009-10-10
  • 打赏
  • 举报
回复
按照我的经验,是可以收到的
ylkhao_hao 2009-10-10
  • 打赏
  • 举报
回复
感谢楼上各位。虚套接口被“优雅”的终止是个什么意思呢?下面是百度的内容
readfds参数标识等待可读性检查的套接口。如果该套接口正处于监听listen()状态,则若有连接请求到达,该套接口便被标识为可读,这样一个accept()调用保证可以无阻塞完成。对其他套接口而言,可读性意味着有排队数据供读取。或者对于SOCK_STREAM类型套接口来说,相对于该套接口的虚套接口已关闭,于是recv()或recvfrom()操作均能无阻塞完成。如果虚电路被“优雅地”中止,则recv()不读取数据立即返回;如果虚电路被强制复位,则recv()将以WSAECONNRESET错误立即返回。如果SO_OOBINLINE选项被设置,则将检查带外数据是否存在(参见setsockopt())。

当检测到套接口可读,但是返回数据为0的话,我不退出while循环,那么后续的报警信息能否正确收到?
an_bachelor 2009-10-10
  • 打赏
  • 举报
回复
我看客户端可以开一个线程用阻塞模式recv数据 反正是客户端 连接数不会多
lijianli9 2009-10-09
  • 打赏
  • 举报
回复
msdn如下解释
For connection-oriented sockets, readability can also indicate that a request to close the socket has been received from the peer. If the virtual circuit was closed gracefully, and all data was received, then a recv will return immediately with zero bytes read. If the virtual circuit was reset, then a recv will complete immediately with an error code such as WSAECONNRESET. The presence of OOB data will be checked if the socket option SO_OOBINLINE has been enabled (see setsockopt).
dempsey 2009-10-09
  • 打赏
  • 举报
回复
由一个传递时间参数的数据结构,传递给select,设定一个等待时间间隔后,当等待时间到达或者有数据可读时,select就会返回,这时是非阻塞的,根据你的需要完全可以把这个等待时间设的大一点。
ylkhao_hao 2009-10-09
  • 打赏
  • 举报
回复
补充下:
实现的功能是客户端接收服务器端的报警信息,可能会很长时间没有报警,所以使用select方法来确定套接字是否可读,发现没有报警的时候(这时服务器端是不会发送数据的),套接字还是可读的,但接收的数据长度为0。

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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