2013-08-26 203 views
1

我通過套接字發送/接收文件有問題。例如 - 在小視頻(440 Mb)中,整個視頻都存在干擾(綠噪聲)。 Bug sreenshot通過套接字發送文件

爲什麼會這樣呢?

// server side 
bool ClientThread::GetFile(char* path, LPDWORD fileSize, LPDWORD bytes) 
{ 
    FileInfo* fileInfo = new FileInfo(); 
    if (!m_client->SyncGetRequest(fileInfo)) 
    { 
     delete fileInfo; 
     return false; 
    } 

    *fileSize = fileInfo->parts * fileInfo->partSize + fileInfo->remain; 

    HANDLE hFile = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
    if (hFile == INVALID_HANDLE_VALUE) 
    { 
     printf("Creating file is failed!\n"); 
     delete fileInfo; 
     return false; 
    } 
    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, *fileSize, 0); 
    if (!hMap) 
    { 
     printf("Creating file mapping is failed!\n"); 
     CloseHandle(hFile); 
     delete fileInfo; 
     return false; 
    } 

    void* ptr = MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, *fileSize); 
    if (!ptr) 
    { 
     printf("Map View of file has been failed!\n"); 
     CloseHandle(hMap); 
     CloseHandle(hFile); 
     delete fileInfo; 
     return false; 
    } 

    for (int i = 0; i < fileInfo->parts; i++) 
    { 
     int received = m_client->SyncGetRequest((byte*)((DWORD)ptr + i * fileInfo->partSize), fileInfo->partSize); 
     if (received != fileInfo->partSize) 
      printf("WARNING! Byte mismatch detected! Part: %d\n", i + 1); 

     if (received <= 0) 
     { 
      printf("File receiving is failed! Part: %d\n", i + 1); 

      UnmapViewOfFile(ptr); 
      CloseHandle(hMap); 
      CloseHandle(hFile); 

      delete fileInfo; 
      return false; 
     } 
     *bytes += received; 
    } 

    if (fileInfo->remain > 0) 
    { 
     int received = m_client->SyncGetRequest((byte*)((DWORD)ptr + fileInfo->parts * fileInfo->partSize), fileInfo->remain); 
     *bytes += received; 
    } 
    UnmapViewOfFile(ptr); 

    CloseHandle(hMap); 
    CloseHandle(hFile); 
    delete fileInfo; 
    printf("File successfully received!\n"); 
    return true; 
} 
// client side 
void Client::SendFile(HANDLE hFile) 
{ 
    DWORD partSize = 4096; 
    DWORD size = GetFileSize(hFile, NULL); 

    int parts = size/partSize; 
    int remain = size - parts * partSize; 

    FileInfo fInfo = { parts, partSize, remain }; 

    if (!SyncSendRequest(&fInfo)) 
     return; 

    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, 0); 
    if (hMap) 
    { 
     void* ptr = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0); 
     if (ptr) 
     { 
      for (int i = 0; i < parts; i++) 
      { 
       if (!SyncSendRequest((byte*)((DWORD)ptr + i * partSize), partSize)) 
       { 
        printf("Error sending file! Part: %d\n", i + 1); 
        break; 
       } 
      } 

      if (remain > 0) 
      { 
       SyncSendRequest((byte*)((DWORD)ptr + parts * partSize), remain); 
      } 

      UnmapViewOfFile(ptr); 
     } 
     CloseHandle(hMap); 
    } 

    printf("File is sent!\n"); 
} 

SyncSendData做從/ send和recv響應服務器(1個字節)

SyncGetData做的recv和/發送響應到服務器(1個字節)

而且具有匹配接收的文件的大小原始文件的大小。

+2

你確定你在另一邊有所有相同的編解碼器,也許你正在接收正確的文件,只是由於一些編解碼器問題無法播放它? –

+1

天啊!謝謝!我只需要安裝一些編解碼器! –

+0

如果這實際上有幫助,我已經添加了相同的答案。 :) –

回答

1

問題原因不在於傳輸協議。但從截圖中可以看出,您正在使用Windows Media Player窗口來運行視頻。

嘗試安裝一些視頻編解碼器,然後查看視頻是否正確播放。

檢查文件有效性的另一種簡單方法是在兩側執行校驗和。 (他們應該是平等的)。

問候。