解决方案 »
- 看来msdn里面的解释是错误的啊!太烦人了
- 怎么把两张位图叠加到一起呢???
- 弱弱的问题 VC中怎么把创建好的菜单显示在窗体上
- 使用Dirext 播放音频文件 的问题
- 在一个工程当中,seting-library-ouput file name是***.lib,请问这是用那种工程类型生成的
- 请教高手们:vc中同时连接多个数据库(好比1个DB两个表,和两个DB)
- 如何像键盘发送一个消息,相当于鼠标按下操作
- 有无模式对话框的显示问题?
- 电子白板源代码
- 关于C++前途问题
- 关于内存共享节的问题。。。比较诡异呀。。。
- CoCreateInstance和CoGetClassObject功能一样吗,能否互相替代?
当调试服务端,断点设在while循环体内时,while循环体不会进入死循环。
当运行服务端时,while就进入死循环。
{
ret=recv(socket,buf+bytes,me.nLen-bytes,0);
bytes+=ret;
}
{
long nType;//消息类型
long nLen;//数据的长度
char *msg;
}
保证接收me.nLen长度的字符串
ret=recv(socket,buf+bytes,me.nLen-bytes,0);
recv调用失败返回了-1;所以进入了无限循环。
GetLasterError()返回10035,当前操作还没完成。是不是由于先发送了头,服务端接收到头后,再读取数据,
由于头和数据分开发,数据段还未收到,
所以recv(socket,buf+bytes,me.nLen-bytes,0)调用失败
返回了-1;
你用的是非阻塞的socket吧
使用非阻塞的socket应该在recv之前先用select判断下是否有数据可读
我用的是WSAAsyncSelect模型,如何用select判断判断下是否有数据可读。
while循环应该如何写呢?
采用11楼的方法程序运行正常(可以在recv后面加一句 if(ret == -1) continue)
但如果recv()在一段时间内一直返回ret的话,那么在该时间段内不就一直会执行while循环体?
recv调用失败返回了-1;
GetLasterError()返回10035,当前操作还没完成。出现上面情况是不是客户端的发的数据还没到达服务端呢?
int ret,bytes=0;
char buf[1024];
while(bytes!=me.nLen)
{
ret=recv(socket,buf+bytes,me.nLen-bytes,0);
if(ret == SOCKET_ERROR)
{
if (WSAGetLastError() == WSAEWOULDBLOCK) continue;
else break;//接收出现错误,必须退出了。
}
bytes+=ret;
}