c - 如何将位图发送到服务器?使用 C
问题描述
我正在尝试将位图图像发送到服务器,但服务器无法接收位图文件。我检查了客户端发送字节和服务器接收字节。在这个问题之前,我在堆栈溢出中提出了类似的问题。而且我知道我不检查发送字节和接收字节。所以我检查了这些,但服务器无法接收位图。服务器只打印灰色。发送函数返回 3244104 和接收函数返回 3244104 是一样的。帮我.........
这是我的服务器代码。
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg,
WPARAM wParam, LPARAM lParam)
{
HDC hdcWindow;
HDC hdcbuffer;
HBITMAP hbm = NULL;
static BITMAPINFOHEADER bi;
static WSADATA wsadata;
static SOCKET s, cs;
static SOCKADDR_IN addr = { 0 }, c_addr;
int size;
static char* buffer;
switch (iMsg)
{
case WM_CREATE:
WSAStartup(MAKEWORD(2, 2), &wsadata);
s = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = 20;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(s, (LPSOCKADDR)&addr, sizeof(addr));
WSAAsyncSelect(s, hwnd, WM_ASYNC, FD_ACCEPT);
if (listen(s, 5) == -1)
return 0;
break;
case WM_ASYNC:
switch (lParam)
{
case FD_ACCEPT:
size = sizeof(c_addr);
cs = accept(s, (LPSOCKADDR)&c_addr, &size);
WSAAsyncSelect(cs, hwnd, WM_ASYNC, FD_READ);
break;
case FD_READ:
hdcWindow = GetDC(hwnd);
hdcbuffer = CreateCompatibleDC(hdcWindow);
recv(cs, (char*)&bi, sizeof(bi), 0);
buffer = (char*)malloc(bi.biSizeImage);
int i = recv(cs, buffer, bi.biSizeImage, 0);
hbm = CreateCompatibleBitmap(hdcWindow, bi.biWidth, bi.biHeight);
SelectObject(hdcbuffer, hbm);
SetDIBits(hdcbuffer, hbm, 0, bi.biHeight, buffer, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
BitBlt(hdcWindow,
0, 0,
bi.biWidth, bi.biHeight,
hdcbuffer,
0, 0,
SRCCOPY);
free(buffer);
DeleteObject(hbm);
ReleaseDC(hwnd, hdcWindow);
DeleteDC(hdcbuffer);
break;
}
break;
case WM_DESTROY:
closesocket(cs);
closesocket(s);
WSACleanup();
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
这是我的客户代码。
HINSTANCE hinst;
char* lpbitmap = NULL;
SOCKET s;
RECT rcClient;
HDC hdcScreen;
HDC hdcWindow;
int CaptureAnImage(HWND hWnd)
{
static HDC hdcMemDC;
static HBITMAP hbmScreen;
static BITMAP bmpScreen;
hdcScreen = GetDC(NULL);
hdcWindow = GetDC(hWnd);
hdcMemDC = CreateCompatibleDC(hdcWindow);
GetClientRect(hWnd, &rcClient);
SetStretchBltMode(hdcWindow, HALFTONE);
StretchBlt(hdcWindow,
0, 0,
rcClient.right, rcClient.bottom,
hdcScreen,
0, 0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
SRCCOPY);
hbmScreen = CreateCompatibleBitmap(hdcWindow, rcClient.right - rcClient.left, rcClient.bottom
- rcClient.top);
SelectObject(hdcMemDC, hbmScreen);
BitBlt(hdcMemDC,
0, 0,
rcClient.right - rcClient.left, rcClient.bottom - rcClient.top,
hdcWindow,
0, 0,
SRCCOPY);
GetObject(hbmScreen, sizeof(BITMAP), &bmpScreen);
BITMAPINFOHEADER bi;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bmpScreen.bmWidth;
bi.biHeight = bmpScreen.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
GetDIBits(hdcWindow, hbmScreen, 0, bmpScreen.bmHeight, NULL, (BITMAPINFO*)&bi,
DIB_RGB_COLORS);
if (!bi.biSizeImage)
{
bi.biSizeImage = (((bi.biWidth*bi.biBitCount + 0x1F)&~0x1F) >> 3)*bi.biHeight;
}
lpbitmap = (char*)malloc(bi.biSizeImage);
GetDIBits(hdcWindow, hbmScreen, 0,
(UINT)bmpScreen.bmHeight,
lpbitmap,
(BITMAPINFO*)&bi, DIB_RGB_COLORS);
send(s, (char*)&bi, sizeof(bi), 0);
send(s, lpbitmap, bi.biSizeImage, 0);
free(lpbitmap);
DeleteObject(hbmScreen);
DeleteObject(hdcMemDC);
ReleaseDC(NULL, hdcScreen);
ReleaseDC(hWnd, hdcWindow);
return 0;
}
帮帮我……我无法解决这个问题……
解决方案
推荐阅读
- sql - 如何在 Oracle SQL 中查询给出列最大值和该行对应列的数据?
- scala - 运行 Docker 映像(Snowplow,Scala)时获取配置文件 config.hocon 不存在
- here-api - 如何使用 HERE MAP REST API 获取从一个起点到多个目的地的距离(直达距离)
- python - 在一个图中绘制两个单独的图例
- python - 如何从列表列创建组合的 Pyspark 数据框
- vue.js - 渲染中的Vuetify v-data-table错误:“TypeError:_a未定义”
- events - Highcharts 事件捕捉点击圆环图的切片,并从事件中获取切片信息
- node.js - Discord 命令:args.join 不是函数
- wordpress - Facebook 自定义转化没有正确跟踪
- python-3.x - 在 tkinter python 中保存 txt 文件