关机后要做什么(袜子,SD_SEND)

时间:2013-11-10 10:43:51

标签: sockets file-transfer shutdown winsock2

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

服务器发送文件代码:

    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);

客户端receiveFile代码:

    //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)我没有收到所有预期的字节但是如果我使用它我不知道如何发送更多文件(如何唤醒发送部分的插座)。

谢谢!

1 个答案:

答案 0 :(得分:0)

我看不出shutdown()与它有什么关系。您应该以任何方式接收所有字节。如果要发送多个文件,则必须在每个文件之前发送长度,并准确读取从套接字到每个目标文件的多个后续字节。

NB如果recv()返回零,则应关闭套接字并中断。如果返回-1,则应记录errno,例如:通过perror(),关闭套接字,然后中断。