select函数什么时候返回-1?

sobug 2009-11-08 10:21:16


fd_set fds;
FD_ZERO(&fds);
FD_SET(ClientSocket.client,&fds);
timeval timeout={3,0}; //select等待3秒,3秒轮询,要非阻塞就置0

int ret=select(0,&fds,NULL,NULL,&timeout);

// <1> 异常
if (ret==SOCKET_ERROR)
{
break;
}

// <2> 无响应:超时
if (ret==0)
{
continue;
}



我用TCP工具测试的时候如果超过3秒钟不往程序上发数据他就会返回SOCKET_ERROR值了。 这个过程中是不是就是常说的需要心跳包的那个过程?

这里的3秒轮询,是不是就是说超过3秒没有数据就认为连接断开了?这中间的过程能给解释一下吗?谢谢
...全文
959 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfx_net 2009-11-09
  • 打赏
  • 举报
回复
WSAEINVAL The time-out value is not valid, or all three descriptor parameters were NULL.
sun007700 2009-11-09
  • 打赏
  • 举报
回复
“ 这里的3秒轮询,是不是就是说超过3秒没有数据就认为连接断开了?这中间的过程能给解释一下吗?谢谢”

3秒只是一个轮循时间,就是用3秒的时间轮循判断socket是否可读可写,如果3秒后依然没有可读可写的socket那么就返回0.
而>0是就说明返回了几个可读可写的socket。
-1时说明网络异常了。此时需要closesocket然后重新建立连接。
不过-1有一种情况是不需要closesocket的,就是非阻塞的socket时,当判断GetLastError()返回值为10035时,此时可以不作处理就像 select==0时一样。
sobug 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fuzhk 的回复:]
是不是客户端连接以后就退出了
[/Quote]
没有退出,一直在运行着,只是没有发送数据,或者发送过数据,但是超过规定的时间不发数据就会出现WSAEINVAL
fuzhk 2009-11-09
  • 打赏
  • 举报
回复
是不是客户端连接以后就退出了
sobug 2009-11-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wfx_net 的回复:]
返回-1时,用WSAGetLastError看看错误代码?
[/Quote]

是 WSAEINVAL
我是连接上之后什么数据也不给它发送,就得到了WSAEINVAL
wfx_net 2009-11-08
  • 打赏
  • 举报
回复
返回-1时,用WSAGetLastError看看错误代码?

18,356

社区成员

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

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