簡體   English   中英

從套接字流中分離並顯示位圖

[英]Separate and display bitmap from a socket stream

如何從多個圖像的連續套接字流中分離和顯示位圖圖像? 當僅收到一個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;
} 

此處描述的位圖格式

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

標頭中包含文件大小字段。 您可以閱讀每個位圖的內容,並知道當前位圖的結尾在哪里。

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

一個簡單的發送標題(包含圖像的大小(以字節為單位),可能還包含圖像類型),然后發送實際的圖像數據就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM