是以二进制方式来传送文件的,对于文本文件传没什么问题,但是对于可执行文件等就出现异常现象了,比如说客户端还在发送,但是服务端却断开了,到底是我对二进制流的判断出了问题还是,其他的问题,希望有人能告诉我。
服务端:if( (stream = fopen( "I:\\d.txt", "wb" )) != NULL )
{
 while (buff[0]!= NULL)//检查缓冲区
{  
  memset(buff,NULL,1024);
  bufflen = recv(sockettemp,buff,1024,0);
  if (buff[0]== NULL)
  break;
  numwritten = fwrite( buff, sizeof( char ),bufflen, stream );
  send(sockettemp, config,4, 0);//发送确认消息
  cout<<endl;
  cout<<"Number of items write = "<<bufflen;
  filesize=filesize+bufflen;
  i++;
}客户端:
while (!feof(stream))  
   {
         numread = fread( buff, sizeof( char ),1024, stream );
bufflen=send(socketServer, buff,numread, 0);
         recv(socketServer,config,4,0);
         cout<<endl;
         cout<<"Number of items read = "<<numread;
         memset(buff,NULL,1024);
cout<<"\t"<<config;
memset(config,NULL,4);
i++;
         FileSize=FileSize+numread;
   }

解决方案 »

  1.   

    其他得程序我不看,光看你得客户端发送数据,应该就有问题,send都没有判断是否已经把数据发送出去。
      

  2.   

    flinming  
    那你说要怎么样去判断啊,为什么我传文本的时候就没问题,而传非文本的时候就有问题呢?
      

  3.   

    问题出在接收文件时,判断接收完毕的方法不对你写的:
    while (buff[0]!= NULL)//检查缓冲区不能用 buff[0] != NULL 作为结束标志
    因为文本文件中一般不会有 0,但二进制的exe文件中就会有很多 0 了
    所以你传送文本文件没问题,传送exe文件就有问题了正确方法应该先传送文件的长度,然后传送文件的内容
    通过接收的总长度等于文件长度后,接收完毕