小弟在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)长度后以上函数不会退出,而继续等待直到超时,请问大侠如何修改可以避免这样的错误??

解决方案 »

  1.   

    messagerecv不是应该为一个指定的数吗?譬如1K,如果受到的数据长度不为这个数
    就表示该数据已经结束。
      

  2.   

    程序一塌糊涂length=length-messagerecv;
    length表示的是缓冲区长度,没接收一次缓冲区长度就变小?
    你这里的size是要接收文件的大小还是缓冲区的大小??
    看来好像是前者,那么缓冲区大小呢?messagerecv=recv(tsock,temp,length,0);这里很可能temp越界访问
      

  3.   

    const BUFFER_SIZE = 4096;   //一次收4k数据recv(tsock,temp,BUFFER_SIZE,0);