select 突然不返回时什么原因 本帖最后由 tangaowen 于 2010-08-10 22:32:28 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的select不会设置一个超时值啊?TCP是流式的,两个包可能同时到 呵呵,我刚学网络编程,新手,不好意思设置一个超时值?那你的意思是超时返回我再继续select吗,直到select成功???那是不是我需要给每个包编个号啊,我现在是按照我接收的顺序组成一幅屏幕BMP的??? 1:select设置超时值timeval timeout;timeout.tv_sec=0;timeout.tv_usec=200000; ret=::select(0,NULL,&fdSend,NULL,&timeout);2:确认recv(socket_client,buffer,MAX_PATH,0);没有收到两个联系的客户端的包。 如果select超时了,你接着循环select不用加编号,可以加个包头,包头中包含你发送包体的长度, 包头是什么,包头长度是指我每次 Send的数据的长度吗?我在开始发送了每个屏幕截图的总数据长度给了客户端的,客户端是知道每屏数据需要接收多少数据才接收完毕的 意思是如果client发送了两个包,但是是连在一起的,你的server只读取了一个发送出去了,因为你的buffer是不是能容下两个please send next screen slap 按照你们说的,服务器设置超时后,发现进入 超时返回的死循环,就是select 每次返回0但是我的客户端是显示发送请求成功了的,为啥服务器就是select发现不了有数据可读呢?奇怪的是,我不是一开始就跑不了,是跑了一段时候后就这样了 你可以做日志,看看你的server和client是不是对称的, 应该不会的吧,我客户端如果发送请求成功了就不会发了,就会进入接收屏幕数据的循环。另外,我服务器的接收的buf是MAX_PATH 也就是260,接收两个没有问题,而且我这些都是打了LOG用cout输出的,在先前没有设置超时前,就发现是select没有返回,现在设置了超时,就是每次超时返回,然后死循环一直在等待请求,其实请求早已经在客户端发送出来了 一直都是有打日志的。这是服务器的LOG;收到消息:please send next screen slap继续发送下一屏数据屏幕数据发送完毕收到消息:please send next screen slap继续发送下一屏数据屏幕数据发送完毕收到消息:please send next screen slap继续发送下一屏数据屏幕数据发送完毕select返回nRet=0 等待读失败select返回nRet=0 等待读失败select返回nRet=0 等待读失败select返回nRet=0 等待读失败select返回nRet=0 等待读失败select返回nRet=0 等待读失败select返回nRet=0 等待读失败select返回nRet=0 等待读失败select返回nRet=0 等待读失败。。这里一直输出这个死循环这是客户端的LOG:屏幕数据大小:4096000使用原先内存屏幕数据接收完毕通知server发送下一屏数据通知发送下一屏数据 发送成功屏幕数据大小:4096000使用原先内存屏幕数据接收完毕通知server发送下一屏数据通知发送下一屏数据 发送成功 在这里卡住 select(0,&set_read,NULL,NULL,NULL))>仅仅监控read状态是不足够的,如果socket上有异常,你可能无法检测到,所以要同时监控exceptionset 额,我晚上回去传个set_error给select看看是不是有错误发生了 lijianli9我怎末跟您联系啊,呵呵怎末没有消息了 进程挂起后,为何还能处理刷新消息? vs2005中需要LPCTSTR类型的参数 在使用时的问题 急!!!windows server 2003下的怪问题 熟悉费尔防火墙源码的高手进 大家有MyDetective按键侦测程序的代码吗?就是监测鼠标及键盘的所有按下次数。 VS2003 ,VS2005源代码编辑器错行的问题. 用COM的问题 exe问题 怎样为静态文本框加快捷键??? 在com组件中如何获得连接客户的IP地址? 怎么做到将接收的文件放到某个文件夹里面? 做过pos机的管理系统的大侠帮帮忙
TCP是流式的,两个包可能同时到
呵呵,我刚学网络编程,新手,不好意思
设置一个超时值?那你的意思是超时返回我再继续select吗,直到select成功???
那是不是我需要给每个包编个号啊,我现在是按照我接收的顺序组成一幅屏幕BMP的???
timeval timeout;
timeout.tv_sec=0;
timeout.tv_usec=200000;
ret=::select(0,NULL,&fdSend,NULL,&timeout);
2:确认recv(socket_client,buffer,MAX_PATH,0);没有收到两个联系的客户端的包。
不用加编号,可以加个包头,包头中包含你发送包体的长度,
但是我的客户端是显示发送请求成功了的,为啥服务器就是select发现不了有数据可读呢?奇怪的是,我不是一开始就跑不了,是跑了一段时候后就这样了
应该不会的吧,我客户端如果发送请求成功了就不会发了,就会进入接收屏幕数据的循环。另外,我服务器的接收的buf是MAX_PATH 也就是260,接收两个没有问题,而且我这些都是打了LOG用cout输出的,在先前没有设置超时前,就发现是select没有返回,现在设置了超时,就是每次超时返回,然后死循环一直在等待请求,其实请求早已经在客户端发送出来了
一直都是有打日志的。这是服务器的LOG;
收到消息:please send next screen slap
继续发送下一屏数据
屏幕数据发送完毕
收到消息:please send next screen slap
继续发送下一屏数据
屏幕数据发送完毕
收到消息:please send next screen slap
继续发送下一屏数据
屏幕数据发送完毕
select返回nRet=0 等待读失败
select返回nRet=0 等待读失败
select返回nRet=0 等待读失败
select返回nRet=0 等待读失败
select返回nRet=0 等待读失败
select返回nRet=0 等待读失败
select返回nRet=0 等待读失败
select返回nRet=0 等待读失败
select返回nRet=0 等待读失败
。。
这里一直输出这个死循环
这是客户端的LOG:
屏幕数据大小:4096000
使用原先内存
屏幕数据接收完毕
通知server发送下一屏数据
通知发送下一屏数据 发送成功
屏幕数据大小:4096000
使用原先内存
屏幕数据接收完毕
通知server发送下一屏数据
通知发送下一屏数据 发送成功
在这里卡住
仅仅监控read状态是不足够的,如果socket上有异常,你可能无法检测到,所以要同时监控exceptionset
额,我晚上回去传个set_error给select看看是不是有错误发生了
怎末没有消息了