recv函数的问题,谢谢

我的程序难以实现的地方是:过了5秒,如果没有接收到网络中的数据,那么就不接收数据。//我设计了一个计时器:doubleCalTime(inttimeLen){double... 我的程序难以实现的地方是:
过了5秒,如果没有接收到网络中的数据,那么就不接收数据。
//我设计了一个计时器:
double CalTime(int timeLen)
{
double durtation = 0;
clock_t finish;
clock_t start = clock();
while(true) {
finish = clock();
durtation = (double)(finish-start)/1000;
if((double)timeLen <= durtation) {
break;
}
}
return durtation;
}
//////
因为,调用了recv函数,如果没有从网络中接收到数据,就一直等待,也就无法执行recv函数的下一行代码了;
如果用线程执行recv的话,那么,只能用TerminateThread关闭该线程了,然而,TerminateThread会引起程序出现异常现象(我试过了)!!!
所以,我还是有待于大家给出一个万全之策啊!!!
注:我的程序是---控制台应用程序+MFC库!!!不能进行消息相应!!!
展开
 我来答
百度网友0b30379
2008-10-19 · TA获得超过863个赞
知道小有建树答主
回答量:850
采纳率:0%
帮助的人:264万
展开全部
你的问题可能不再这几行代码中,TerminateThread关线程会让后续操作对象的代码无法执行,而这些对象可能会被其它线程调用,为初始化的对象指针肯定会引发错误。
为了避免这种错误,楼上的方法可以尝试,你可以用以辅助变量通知线程退出,让其自行退出,并做好善后工作。
另一个方法是把你其中要求跨线程引用地对象通过CriticalSection以及其它同步机制做好线程安全工作。但是,问题是CriticalSection在线程被TerminateThread时,状态是无法预知的,你要小心。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
研究报告站
2008-10-21 · TA获得超过195个赞
知道小有建树答主
回答量:441
采纳率:0%
帮助的人:320万
展开全部
你可以用
select
或者WSAEventSelect
函数来做

或者把其设置成非阻塞形式的。
就算都不用,用线程单独处理,只要方法得当也不会产生不良影响,比如在里面检测外部事件消息,检测socket错误并进行处理等。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
幸巴达
2008-10-18 · TA获得超过1.2万个赞
知道大有可为答主
回答量:6953
采纳率:38%
帮助的人:2417万
展开全部
向这个接收socket发送一个特定的数据, 如果接收到这个特定数据就退出循环。也可以吧while条件改成全局变量
bool g_bquit = false

main thread:
{
g_bquit=true;
send(s, "q",1, 0);
}
recv thread:
{
while(!g_bquit)
{
recv(...
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
老子行道人3370
2008-10-23
知道答主
回答量:3
采纳率:0%
帮助的人:0
展开全部
设置超时函数setsockopt
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友32cdd9945
2008-10-19 · TA获得超过1374个赞
知道大有可为答主
回答量:2429
采纳率:100%
帮助的人:1915万
展开全部
你可以用
select
或者WSAEventSelect
函数来做
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式