2013-02-22 35 views
0

如何從連續的多個圖像套接字流中分離並顯示位圖圖像?當只有一個bmp接收時,以下代碼將保存並顯示單個圖像。當套接字流包含多個位圖圖像(例如BM .... BM .... BM ...)時,如何分離和顯示圖像?從套接字流中分離並顯示位圖

DWORD WINAPI CServerDlg::ThreadSocket(LPVOID lpParam) 
{ 
    CServerDlg *pThis = (CServerDlg *)lpParam; 

    SOCKET server; 

    WSADATA wsaData; 
    int wsaret = WSAStartup(MAKEWORD(2,2), &wsaData); 
    if(wsaret != 0) 
    { 
     return 0; 
    } 

    sockaddr_in local; 
    local.sin_family = AF_INET; //Address family 
    local.sin_addr.s_addr = INADDR_ANY; //Wild card IP address 
    local.sin_port = htons((u_short)8888); //port to use 

    server = socket(AF_INET, SOCK_STREAM, 0); 
    if(server == INVALID_SOCKET) 
    { 
     return 0; 
    } 

    if(bind(server, (sockaddr*)&local, sizeof(local)) != 0) 
    { 
     return 0; 
    } 
    if(listen(server, 10) != 0) 
    { 
     return 0; 
    } 

    SOCKET_STREAM_FILE_INFO  StreamFileInfo; 
    memset(&StreamFileInfo, 0, sizeof(SOCKET_STREAM_FILE_INFO)); 
    SOCKET client; 
    sockaddr_in from; 
    int fromlen = sizeof(from); 
    while(pThis->m_bListen) 
    { 
     char temp[1024]; 
     memset(temp, 0, 1024); 
     client = accept(server, (struct sockaddr*)&from, &fromlen); 
     int iLen = recv(client, temp, sizeof(SOCKET_STREAM_FILE_INFO), 0); 
     if(iLen == sizeof(StreamFileInfo)) 
     { 
      memcpy(&StreamFileInfo, temp, sizeof(StreamFileInfo)); 
      CFile destFile(StreamFileInfo.szFileTitle, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); 
      UINT dwRead = 0; 
      while(dwRead < StreamFileInfo.nFileSizeLow) 
      { 
       memset(temp,0,1024); 
       UINT dw = recv(client, temp, 1024, 0); 
       destFile.Write(temp, dw); 
       dwRead += dw; 
      } 
      destFile.Close(); 

      pThis->LoadPicture(StreamFileInfo.szFileTitle); // Display image in a dialog box 
     } 
     closesocket(client); 
    } 
    closesocket(server); 
    WSACleanup(); 

    return 0; 
} 
+0

在接收之前,您不需要'memset',因爲'recv'調用將寫入它。此外,在調用'recv'時,您應該始終檢查錯誤或關閉連接。 – 2013-02-24 13:20:57

回答

1

位圖格式此處描述

http://en.wikipedia.org/wiki/BMP_file_format

包括在所述報頭中的文件大小字段。您可以讀取每個位圖並知道當前位圖的結尾位置。

+0

每個圖像的長度包含在標題中。上述代碼的問題是所有圖像將作爲一個二進制文件連續保存。 – askingtoomuch 2013-02-22 23:51:50

+0

我知道位圖二進制以「BM」(0×42 0x4D)開始,我如何找到它,然後從流中提取它?我如何閱讀「0x42 0x4D」? – askingtoomuch 2013-02-23 02:30:27

0

您需要設計一個區分不同圖像的協議。

一個簡單的發送頭(包含圖像的大小(以字節爲單位)和可能的圖像類型),其次是實際的圖像數據就足夠了。

+0

我使用固定長度的位圖圖像發送連續流。在發送每個圖像之前,每個圖像的長度也會發送到服務器,並且它也包含在每個圖像的標題中。 – askingtoomuch 2013-02-22 23:59:45

+0

@boogiedoll固定大小,或將大小作爲標題發送就足夠了。如果數據流中的所有數據都是固定長度的,那麼您就會知道每次讀取多少數據,並準確讀取數據。 – 2013-02-23 04:35:25

+0

我如何閱讀固定長度的文件?我是否直接從緩衝區讀取?或保存爲一個文件,然後顯示? – askingtoomuch 2013-02-24 12:58:36