小弟在win32下利用winsock编写了一个接收信息的程序如下:
static int RecvMessage(SOCKET tsock,char *buffer,int size)
{
char *temp=buffer;
int length=size;
int messagerecv;
while(length>0)
{
messagerecv=recv(tsock,temp,length,0);
if(messagerecv==SOCKET_ERROR)
{
strcpy(error,"failed to receive message");
return -1;
}
if(messagerecv==0)
{
return (size-length);
}
temp=temp+messagerecv;
length=length-messagerecv;
}
return (size-length);
}
其中size为缓冲区所使用的长度,但在实际的调用改函数时,只有当size的大小小于或等于所需要接收的字符长时才能很好的运行否则会发生一直等待的现象,如:假设需要接收的字符串为char *send,接收时size>strlen(send)时,当接收到strlen(size)长度后以上函数不会退出,而继续等待直到超时,请问大侠如何修改可以避免这样的错误??
static int RecvMessage(SOCKET tsock,char *buffer,int size)
{
char *temp=buffer;
int length=size;
int messagerecv;
while(length>0)
{
messagerecv=recv(tsock,temp,length,0);
if(messagerecv==SOCKET_ERROR)
{
strcpy(error,"failed to receive message");
return -1;
}
if(messagerecv==0)
{
return (size-length);
}
temp=temp+messagerecv;
length=length-messagerecv;
}
return (size-length);
}
其中size为缓冲区所使用的长度,但在实际的调用改函数时,只有当size的大小小于或等于所需要接收的字符长时才能很好的运行否则会发生一直等待的现象,如:假设需要接收的字符串为char *send,接收时size>strlen(send)时,当接收到strlen(size)长度后以上函数不会退出,而继续等待直到超时,请问大侠如何修改可以避免这样的错误??
解决方案 »
- opengl谁有c++的有关一段隧道漫游的代码?
- socket 监听80 端口
- 请问动态生成的树型控件怎么响应消息函数?
- 如何屏蔽console application的dos窗口,并且将输出重定向?
- dll中对话框为什么不响应按钮事件??
- <windows网络编程>第二版中的程序编译不过去,是不是要装SDK包?
- 在工程中加入自定义的结构,编译出现错误!
- 有什么好办法服务器知道我的IP变了
- vc学习方法大讨论--方法最佳者独得100分
- 如何获得当前打印机端口名?
- 我现在要用vc+ado对数据库进行操作,最终用 excel 输出来.进来都有分! Up有分!分不够再给.
- 有关VC开发环境的一个问题
就表示该数据已经结束。
length表示的是缓冲区长度,没接收一次缓冲区长度就变小?
你这里的size是要接收文件的大小还是缓冲区的大小??
看来好像是前者,那么缓冲区大小呢?messagerecv=recv(tsock,temp,length,0);这里很可能temp越界访问