2015-01-08 3 views
-2

서버에 파일을 업로드하려고하는데 프로그램이 매우 복잡하고 클라이언트와 서버간에 파일을 전송하는 역할 만합니다. 문제를 해결하려면이 코드에서 도움이 필요합니다. 및 개선하십시오.Winsock은 원격 서버에 파일을 업로드합니다.

SERVER

int Socket_Manip::FILE_UPLOAD() { 

    //get file size. 
    iResult = recv(ClientSocket, GotFileSize, LENGTH, 0); 
    if (iResult == 0) 
    { 
     closesocket(ClientSocket); 
     WSACleanup(); 
     return 1; 
    } 
    else if (iResult < 0) { 
     closesocket(ClientSocket); 
     WSACleanup(); 
     return 1; 
    } 

    //start manip download 
    long FileSize = atoi(GotFileSize); 
    long SizeCheck = 0; 
    char* mfcc; 

    FILE *fp = fopen("C::\\Users\\Server\\Downloads\\transfer.zip", "wb"); 
    if (fp == NULL) 
    { 
     closesocket(ClientSocket); 
     WSACleanup(); 
     return 1; 
    } 
    if (FileSize > 1499) { 
     mfcc = (char*)malloc(1500); 
     while (FileSize > SizeCheck){ 
      int Received = recv(ClientSocket, mfcc, 1500, 0); 
      if (Received == 0) 
      { 
       break; 
      } 
      else if (Received < 0) { 
       closesocket(ClientSocket); 
       WSACleanup(); 
       return 1; 
      } 
      SizeCheck += Received; 
      fwrite(mfcc, 1, Received, fp); 
      fflush(fp); 
     } 
    } else 
    { 
     mfcc = (char*)malloc(FileSize + 1); 
     int Received = recv(ClientSocket, mfcc, FileSize, 0); 
     fwrite(mfcc, 1, Received, fp); 
     fflush(fp); 
    } 

    fclose(fp); 
    free(mfcc); 

} 

클라이언트 SENDER

int File_Transfer_Manip() { 
    FILE *File; 
    char *Buffer; 
    unsigned long Size; 


    File = fopen("C:\\Users\\r4minux\\Downloads\\upload.zip", "rb"); 
    if (!File) 
    { 
     printf("Error file\n"); 
     return 1; 
    } 

    fseek(File, 0, SEEK_END); 
    Size = ftell(File); 
    fseek(File, 0, SEEK_SET); 

    Buffer = new char[Size]; 

    fread(Buffer, Size, 1, File); 
    char cSize[MAX_PATH]; 
    sprintf(cSize, "%i", Size); 

    fclose(File); 
    iResult = send(ConnectSocket, cSize, MAX_PATH, 0); // File size 
    if (iResult == SOCKET_ERROR) { 
     printf("send erroR: %d\n", WSAGetLastError()); 
     closesocket(ConnectSocket); 
     WSACleanup(); 
     getchar(); 
     return 1; 
    } 

    int Offset = 0; 
    while (Offset < Size) 
    { 
     int Amount = send(ConnectSocket, Buffer + Offset, Size - Offset, 0); 
     if (Amount <= 0) 
     { 
      std::cout << "Error: " << WSAGetLastError() << std::endl; 
      break; 
     } 
     else 
     { 
      Offset += Amount; 
     } 
    } 

    // cleanup 
    free(Buffer); 

} 

답변

2

TCP는 바이트 스트림이다. 메시지 경계에 대한 개념이 없습니다. send()이 실제로 제공하는 모든 것을 전송하고 있는지, 또는 recv()이 요청한 모든 내용을 읽고 있는지 확인하지 않았습니다. 그들은 CAN보다 적은 바이트를 반환합니다. 그 점을 고려해야합니다.

이 대신보십시오 :

SERVER :

int readBytes(SOCKET s, void *buffer, int buflen) 
{ 
    int total = 0; 

    unsigned char *pbuf = (unsigned char*) buffer; 
    while (buflen > 0) 
    { 
     int iResult = recv(s, pbuf, buflen, 0); 
     if (iResult < 0) 
     { 
      if (WSAGetLastError() == WSAEWOULDBLOCK) 
      { 
       // optionally use select() to wait for the 
       // socket to have more bytes to read before 
       // calling recv() again... 
       continue; 
      } 

      printf("recv error: %d\n", WSAGetLastError()); 
      return SOCKET_ERROR; 
     } 
     else if (iResult == 0) 
     { 
      printf("disconnected\n"); 
      return 0; 
     } 
     else 
     { 
      pbuf += iResult; 
      buflen -= iResult; 
      total += iResult; 
     } 
    } 

    return total; 
} 

int Socket_Manip::FILE_UPLOAD() 
{ 
    //start download 

    FILE *fp = fopen("C::\\Users\\Server\\Downloads\\transfer.zip", "wb"); 
    if (fp == NULL) 
    { 
     printf("Error creating file\n"); 
     closesocket(ClientSocket); 
     WSACleanup(); 
     return 1; 
    } 

    //get file size. 
    unsigned long FileSize; 
    int iResult = readBytes(ClientSocket, &FileSize, sizeof(FileSize)); 
    if (iResult <= 0) 
    { 
     fclose(fp); 
     closesocket(ClientSocket); 
     WSACleanup(); 
     return 1; 
    } 
    FileSize = ntohl(FileSize); 

    char mfcc[1024]; 
    while (FileSize > 0) 
    { 
     int Received = readBytes(ClientSocket, mfcc, min(sizeof(mfcc), FileSize)); 
     if (Received <= 0) 
     { 
      fclose(fp); 
      closesocket(ClientSocket); 
      WSACleanup(); 
      return 1; 
     } 

     if (fwrite(mfcc, 1, Received, fp) != Received) 
     { 
      printf("Error writing file\n"); 
      fclose(fp); 
      closesocket(ClientSocket); 
      WSACleanup(); 
      return 1; 
     } 

     FileSize -= Received; 
    } 

    fflush(fp); 
    fclose(fp); 

    return 0; 
} 

CLIENT

int sendBytes(SOCKET s, void *buffer, int buflen) 
{ 
    int total = 0; 

    unsigned char *pbuf = (unsigned char*) buffer; 
    while (buflen > 0) 
    { 
     int iResult = send(s, pbuf, buflen, 0); 
     if (iResult < 0) 
     { 
      if (WSAGetLastError() == WSAEWOULDBLOCK) 
      { 
       // optionally use select() to wait for the 
       // socket to have more space to write before 
       // calling send() again... 
       continue; 
      } 

      printf("send error: %d\n", WSAGetLastError()); 
      return SOCKET_ERROR; 
     } 
     else if (iResult == 0) 
     { 
      printf("disconnected\n"); 
      return 0; 
     } 
     else 
     { 
      pbuf += iResult; 
      buflen -= iResult; 
      total += iResult; 
     } 
    } 

    return total; 
} 

int File_Transfer_Manip() 
{ 
    char Buffer[1024]; 

    FILE *fp = fopen("C:\\Users\\r4minux\\Downloads\\upload.zip", "rb"); 
    if (!fp) 
    { 
     printf("Error opening file\n"); 
     return 1; 
    } 

    fseek(fp, 0, SEEK_END); 
    unsigned long FileSize = ftell(fp); 
    fseek(fp, 0, SEEK_SET); 

    unsigned long tmpFileSize = htonl(FileSize); 
    int iResult = sendBytes(ConnectSocket, &tmpFileSize, sizeof(tmpFileSize)); 
    if (iResult <= 0) 
    { 
     fclose(fp); 
     closesocket(ConnectSocket); 
     WSACleanup(); 
     getchar(); 
     return 1; 
    } 

    while (FileSize > 0) 
    { 
     long Size = fread(Buffer, 1, min(sizeof(Buffer), FileSize), fp); 
     if (Size <= 0) 
     { 
      printf("Error reading file\n"); 
      fclose(fp); 
      closesocket(ConnectSocket); 
      WSACleanup(); 
      getchar(); 
      return 1; 
     } 

     if (sendBytes(ConnectSocket, Buffer, Size) != Size) 
     { 
      fclose(fp); 
      closesocket(ConnectSocket); 
      WSACleanup(); 
      getchar(); 
      return 1; 
     } 

     FileSize -= Size; 
    } 

    fclose(fp); 
    return 0; 
} 
+1

대단히 감사합니다! – Mrdk

관련 문제