求助:关于单线程recv时的超时问题

wanglei051 2006-05-25 02:33:07
由于我现在做的通讯框架必须是单线程的,所以在recv的时候如果网线断了或者服务器断电等情况的时候,程序就停止到recv这个地方不前了,程序也没有死,但就是因为没有数据发过来,不知道有什么办法可以设置一个超时?请教大家了!
...全文
174 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kbsoft 2006-05-26
  • 打赏
  • 举报
回复
mark
wanglei051 2006-05-25
  • 打赏
  • 举报
回复
谢谢,刚才我也发现这个问题了,最后看了一个帖子解决了,应该这样定义
fd_set readset;
FD_ZERO(&readset);
FD_SET(sockfd,&readset);
struct timeval interval;
int iTimeOut = 5;
interval.tv_sec = iTimeOut;
interval.tv_usec = (iTimeOut > 0)?0:10;
if (!select(sockfd+1,&readset,NULL,NULL,&interval))
{
close(sockfd);
perror("select出错!");
exit(1);
}
linaxing 2006-05-25
  • 打赏
  • 举报
回复
没仔细看的你的代码,两个问题:
1.select()超时值应该是个结构,你直接传5000进去不妥,具体看man手册。
2.把for循环移到上层的select上去,否则仍会在你的recv处阻塞。
wanglei051 2006-05-25
  • 打赏
  • 举报
回复
根本连printf("recv成功!\n");这句都没有执行
wanglei051 2006-05-25
  • 打赏
  • 举报
回复
用了select也不知道是我用错了还是怎么了总是有问题
fd_set readset;
FD_ZERO(&readset);
FD_SET(sockfd,&readset);
if (!select(sockfd+1,&readset,NULL,NULL,5000))
{
close(sockfd);
perror("select出错!");
exit(1);
}
if (FD_ISSET(sockfd,&readset) > 0)
{
for(;;)
{
if ((nRead=recv(sockfd, buff, MAXDATASIZE, 0)) <=0)
{
close(sockfd);
perror("recv出错!");
exit(1);
}
else
{
printf("recv成功!\n");
}
buff[nRead] = '\0';
printf("nRead = %d\n",nRead);

if ((strRecv != NULL) && (length > 0))
{
szTemp = (char *)malloc(length + nRead);
memcpy(szTemp,strRecv,length);
free(strRecv);
memcpy(&szTemp[length],buff,nRead);
strRecv = (char *)malloc(length + nRead+1);
memset(strRecv,0,length+nRead+1);
memcpy(strRecv,szTemp,length+nRead);
free(szTemp);
length += nRead;
}
else
{
strRecv = (char *)malloc(nRead+1);
memset(strRecv,0,nRead+1);
memcpy(strRecv,buff,nRead);
length = nRead;
}
if(strstr(buff,"</return>") != 0 ) break;
}

我在recv前拔了网线,然后程序仍然死到那里了
linaxing 2006-05-25
  • 打赏
  • 举报
回复
改用select()具体看select的man手册
wanglei051 2006-05-25
  • 打赏
  • 举报
回复
没人吗?自己顶一下

23,218

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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