2013-08-26 211 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窗口来运行视频。

尝试安装一些视频编解码器,然后查看视频是否正确播放。

检查文件有效性的另一种简单方法是在两侧执行校验和。 (他们应该是平等的)。

问候。