如何從連續的多個圖像套接字流中分離並顯示位圖圖像?當只有一個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;
}
在接收之前,您不需要'memset',因爲'recv'調用將寫入它。此外,在調用'recv'時,您應該始終檢查錯誤或關閉連接。 – 2013-02-24 13:20:57