社区
Linux/Unix社区
帖子详情
求助:关于单线程recv时的超时问题
wanglei051
2006-05-25 02:33:07
由于我现在做的通讯框架必须是单线程的,所以在recv的时候如果网线断了或者服务器断电等情况的时候,程序就停止到recv这个地方不前了,程序也没有死,但就是因为没有数据发过来,不知道有什么办法可以设置一个超时?请教大家了!
...全文
174
7
打赏
收藏
求助:关于单线程recv时的超时问题
由于我现在做的通讯框架必须是单线程的,所以在recv的时候如果网线断了或者服务器断电等情况的时候,程序就停止到recv这个地方不前了,程序也没有死,但就是因为没有数据发过来,不知道有什么办法可以设置一个超时?请教大家了!
复制链接
扫一扫
分享
转发到动态
举报
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
打赏
举报
回复
没人吗?自己顶一下
IOS_多线程 GCD (OC基于C的多线程函数)
概念解释来自网络: 同步、异步、串行、并行概念 同步和异步决定了要不要开启新的线程 同步:在当前线程中执行任务,不具备开启新线程的能力 异步:在新的线程中执行任务,具备开启新线程的能力 并发和串行决定了任务的执行方式 并发:多个任务并发(同
时
)执行 串行:一个任务执行完毕后,再执行下一个任务 上测试代码: //-创建一个异步全局子线程
求助
完成端口IOCP 编程中 内存上升
问题
最近在项目中使用了IOCP完成端口来实现TCP服务端,发现运行过程中内存持续上升。 实际测试中我只连了一个客户端,每秒发一次数据,大约30左右字符。 请求CSDN高手指点: 代码从网上找的,感觉比较经典,就用了: 附件是IOCP源码,对IOCP的使用介绍的比较好,数据结构设计的比较巧妙,我反复看过也没发现内存泄漏的地方, VS编译器调试结束也没发现memory leak提示. 备注:客...
Python 入门指南:从新手到大师(五)
在本章中,你已经看到了如何通过文件和类似文件的对象与环境交互,这是 Python 中 I/O 最重要的技术之一。类似文件的对象:类似文件的对象(非正式地)是支持一组方法的对象,比如read和readline(可能还有write和writelines打开和关闭文件:通过提供文件名,用open函数打开一个文件。如果你想确保你的文件被关闭,即使出了
问题
,你也可以使用with语句。模式和文件类型:当打开一个文件
时
,你也可以提供一个模式,比如'r'表示读模式,或者'w'表示写模式。通过将'b'
2万字大厂面经:小米嵌入式面试题及参考答案(持续更新)
BIOS (Basic Input/Output System) 是一种存储在ROM中的固件程序,它为计算机提供了最基础的硬件初始化和服务。BIOS主要存在于传统的x86架构计算机中。嵌入式系统的启动流程取决于具体的硬件平台和所采用的操作系统。复位阶段:当系统通电或复位
时
,CPU进入复位状态。硬件初始化:CPU和必要的硬件设备(如内存控制器)被初始化。加载引导加载程序:引导加载程序(如U-Boot)被加载到内存中。执行引导加载程序:引导加载程序开始执行,初始化更多的硬件设备,并检测存储介质。
linux命令大全
Linux命令大全 文章目录Linux命令大全1、帮助命令:(1) help:显示shell内部命令的帮助信息(2) man命令:查看命令帮助信息2、基础命令A系:awk:文本和数据进行处理的编程语言alias:设置命令别名B系:bc:浮点运算bash:shell脚本解释器basename :显示文件路径的基本文件名bzip2 :bz2文件的压缩程序bunzip2:bz2文件的解压缩程序bzcat :读取bzip2压缩文件的内容blkid:显示关于可用块设备的信息break:结束循环语句C 系:cd :切
Linux/Unix社区
23,218
社区成员
74,543
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章