0

我想将几个文件从服务器发送到客户端,但我遇到了问题。

服务器发送文件代码:

    while ((len = fread(Buffer,1,sizeof(Buffer), fs)) > 0)
    {

        if((resultEnviar = send(ClientSocket,Buffer,len,0)) < 0){
            printf("ERROR: Failed to send file %s.\n", nombreArchivoADescargar.c_str());
            break;
        }
        sumEnviada+=resultEnviar;
    }
    fclose(fs);

客户端接收文件代码:

    //shutdown(sock, SD_SEND); ???????

   do{
        recvVal = recv(sock, Buffer2, sizeof(Buffer2), 0);
        if (recvVal <= 0){
          printf("Can't read from socket");
          recvVal =0;
          fclose(fp);
          continue;
        }else{
            int off =0;
        do{        
          int write_sz = fwrite(Buffer2, 1, recvVal, fp); 
          if (write_sz < 0){
              printf("Can't write to file");
              fclose(fp);
              break;};    
          if (write_sz == 0) {cout<<endl<<"Nada que copiar"<<endl; break;}
           off += write_sz;
        }while(off<recvVal);

    bzero(Buffer2, 1024);
            contador+=off;
        }
    }while (contador<LongitudArchivo);
    cout<<endl<<"Numero de bytes recibidos: "<<contador<<endl<<endl;
printf("Ok received from client!\n");
fclose(fp);

如果我不使用 SHUTDOWN(sock, SD_SEND) 我不会收到所有预期的字节但是如果我使用它我不知道如何发送更多文件(如何唤醒套接字的发送部分)。

谢谢!

4

1 回答 1

0

我不明白这shutdown()有什么关系。无论哪种方式,您都应该收到所有字节。如果要发送多个文件,则必须在每个文件之前发送长度,并从套接字将后面的字节数准确地读取到每个目标文件中。

注意如果recv()返回零,您应该关闭套接字并中断。如果它返回-1,您应该记录errno,例如通过perror(),关闭套接字并中断。

于 2013-11-10T22:53:09.530 回答