急!select 怎样用

kenlonzhong 2003-10-17 05:38:58
int ret_len = 0;
int select_ret = 0;
timeval tvvalue = {0, 50000};
fd_set fdread;
FD_ZERO(&fdread);
FD_SET(m_socket,&fdread);
select_ret = select(0,&fdread,NULL,NULL,&tvvalue);
if (SOCKET_ERROR == select_ret)
{
Trace("SOCKET_ERROR == select_ret\n");
return -1;
}
if (select_ret > 0)
{
if (FD_ISSET(m_socket,&fdread))
{
ret_len = recv(m_socket,buf,len,0);
return ret_len;
}
}

如上代码,一个数据流类Socket,用来接收服务器的数据,但如果不Sleep就会经常收不到。服务器端的数据已成功发送。
...全文
46 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lostgdi731 2004-01-27
  • 打赏
  • 举报
回复
楼主说:“如上代码,一个数据流类Socket,用来接收服务器的数据,但如果不Sleep就会经常收不到。服务器端的数据已成功发送。”
说明主要问题不是while(1)这里啊。
我估计你的fdread这里被激活可能是由于其他原因(非recv,如connect or close and so on).
fanfyj 2003-10-18
  • 打赏
  • 举报
回复
up
ufox 2003-10-18
  • 打赏
  • 举报
回复
同意xiaohyy(醉大饿极)
这不是select的用法的问题,而是如何等待另一段发送数据的问题。一般都是专用一个线程,并且其中用for(;;)或while(1)的死循环,要退出的时候使用break;只有这样测能保证随时都在处于等待接受数据的状态
注意,每次select调用完成后,下一次调用前要从新作下面的工作,因为select调用会改写fdread的成员值
fd_set fdread;
FD_ZERO(&fdread);
FD_SET(m_socket,&fdread);
smartcomplier 2003-10-18
  • 打赏
  • 举报
回复
学习.
studyingpersons 2003-10-18
  • 打赏
  • 举报
回复
gz
xiaohyy 2003-10-17
  • 打赏
  • 举报
回复
int ret_len = 0;
int select_ret = 0;
timeval tvvalue = {0, 50000};
fd_set fdread;

// 注意这里
while(TRUE)
{
FD_ZERO(&fdread);
FD_SET(m_socket,&fdread);
select_ret = select(0,&fdread,NULL,NULL,&tvvalue);
if (SOCKET_ERROR == select_ret)
{
Trace("SOCKET_ERROR == select_ret\n");
return -1;
}
if (select_ret > 0)
{
if (FD_ISSET(m_socket,&fdread))
{
ret_len = recv(m_socket,buf,len,0);
return ret_len;
}
}
}



18,356

社区成员

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

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