socket中recv超时如何终于等待?

ccnyou 2010-08-30 01:24:10
我只想到用SetTimer,但超时后只能报错,无法退出正在等待的函数。很浪费资源~顺便问一下,这算多线程吗?
...全文
1155 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
烂番 2010-08-31
  • 打赏
  • 举报
回复
不好意思,select的返回值搞错了
select() 返回值 > 0时,表示 fdSck里可读的socket个数
此时用recv()接收就可以了

对于这个误导,表示道歉
cilluick 2010-08-31
  • 打赏
  • 举报
回复
iResult 是select的返回值,又不是recv的返回值
ccnyou 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 luver 的回复:]
C/C++ code

TIMEVAL oWaitTime;
fd_set fdSck;
oWaitTime.tv_sec = 10*1000; //等待10秒
oWaitTime.tv_usec = 0;
fdSck.fd_count = 1;
fdSck.fd_array[0] = sck; //……
iResult = select(0, &fdSck, NULL, NULL, &oWaitTime);
if(iResult < 0)
{
//连接出错
}
else if(iResult == 0)
{
//等待超时
}
else
{
//iResult为收到的字节数
//这里我xp测试iResult总是1,不是 收到的字节数吧?

}
[/Quote]
skillwell 2010-08-30
  • 打赏
  • 举报
回复
int timeout = 2000;
setsockopt(m_fdSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout))

或者
fd_set fd;
FD_ZERO(&fd);
FD_SET(MySocket,&fd);
struct timeval timeout = {2,0};
switch(select(0,&fd, NULL, NULL, &timeout))

或者(windows平台)
nReturn = WSAEventSelect( m_stSocket, m_stReadEvent, FD_READ);
dwReturn = WSAWaitForMultipleEvents(1, &m_stReadEvent, TRUE, WAIT_TIME, FALSE);
happynwt 2010-08-30
  • 打赏
  • 举报
回复
可用select/poll+非阻塞套接字实现。你这种情况,最好使用非阻塞套接字。

你问的select用法,else里要用宏FD_ISSET判断是否可读,是则读,否则不读。
ccnyou 2010-08-30
  • 打赏
  • 举报
回复
非常感觉12楼代码!是否在最后一个else里调用recv接收iResult字节呢?
xianyuxiaoqiang 2010-08-30
  • 打赏
  • 举报
回复
while(){
select()
sleep()
}
烂番 2010-08-30
  • 打赏
  • 举报
回复

TIMEVAL oWaitTime
oWaitTime.tv_sec = 10*1000; //等待10秒
oWaitTime.tv_usec = 0;
fdSck.fd_count = 1;
fdSck.fd_array[0] = sck; //你的socket
iResult = select(0, &fdSck, NULL, NULL, &oWaitTime); //测试可读
if(iResult < 0)
{
//连接出错
}
else if(iResult == 0)
{
//等待超时
}
else
{
//iResult为收到的字节数
}
mafd_maxwit 2010-08-30
  • 打赏
  • 举报
回复
http://linux.chinaunix.net/bbs/forum-70-1.html
xiehui3651 2010-08-30
  • 打赏
  • 举报
回复
这个请使用google,或者直接上msdn

[Quote=引用 9 楼 ccnyou 的回复:]

能否留下几行代码?用setsockopt的例子?例如设置10s超时,应怎么写?
[/Quote]
ccnyou 2010-08-30
  • 打赏
  • 举报
回复
能否留下几行代码?用setsockopt的例子?例如设置10s超时,应怎么写?
justkk 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 ccnyou 的回复:]
我只想到用SetTimer,但超时后只能报错,无法退出正在等待的函数。很浪费资源~顺便问一下,这算多线程吗?
[/Quote]
超时后,recv没有被中断吗?
lazy_2010 2010-08-30
  • 打赏
  • 举报
回复
先通过 select 看是否有数据,再进行 recv 可以解决。
xiehui3651 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xiehui3651 的回复:]

看是哪个平台,在win32下,使用setsockopt可以设置接收超时时间
[/Quote]

在别的平台一般也都有对应的接口
xiehui3651 2010-08-30
  • 打赏
  • 举报
回复
看是哪个平台,在win32下,使用setsockopt可以设置接收超时时间
DontKissBossAss 2010-08-30
  • 打赏
  • 举报
回复
不懂,先把手头的放下,学吧
ccnyou 2010-08-30
  • 打赏
  • 举报
回复
1楼的我看不懂~另,XP下。
  • 打赏
  • 举报
回复
换个异步的IO进行读写

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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