首页 > 解决方案 > 如何将位图发送到服务器?使用 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;
}

帮帮我……我无法解决这个问题……

标签: csocketswinapibitmap

解决方案


推荐阅读