2013-11-10 3 views
0

Я хочу отправить несколько файлов с сервера на клиент, но у меня возникла проблема.Что делать после завершения работы (носок, SD_SEND)

сервера SendFile код:

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

Client код 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); 

Если я не использую ВЫКЛЮЧЕНИЕ (носка, SD_SEND) Я не получаю все ожидаемые байты, но если Я использую его. Я не знаю, как отправить больше файлов (как просыпать часть отправки сокета).

Спасибо!

+0

Можете ли вы указать тип «Буфер2»? будьте осторожны, если Buffer2 является указателем, так как sizeof (Buffer2) вернет размер указателя (4 байта в 32 битной дуге) вместо емкости буфера. – cbuchart

ответ

0

Я не вижу, что такое shutdown(). Вы должны получить все байты в любом случае. Если вы хотите отправить несколько файлов, вам нужно будет отправить длину впереди каждого из них и точно прочитать столько следующих байтов из сокета в каждом целевом файле.

NB Если recv() возвращает ноль, вы должны закрыть розетку и перерыв. Если он возвращает -1, вы должны зарегистрировать errno, например. через perror(), закройте сокет и сломайте.

+0

http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable Если я завершаю (носок, RECV) все «работает», и я фактически отправляю длину файлов. – user2824788

+0

Если вы завершите работу для чтения, вы получите все, что уже было буферизировано локально до этой точки. Это не может быть весь файл, если весь файл (a) уже получен и буферизирован, и (b) все это помещается в буфер приема сокета. Блог, который вы цитируете, не имеет никакой очевидной значимости, за исключением того, что часть солнца и луны находится в расстановке. – EJP

Смежные вопросы