c++ - 异步 Winsock 服务器的 WndProc 未被调用

标签 c++ windows sockets winsock wndproc

我正在努力学习制作一个合适的 Winsock 服务器,并通过网上找到的示例通过一些试验和努力获得了以下代码。我的服务器确实出现在“netstat -an”中,并且可以通过 Hercules IO 调试器应用程序连接到。不幸的是,在 WndProc 中看到的消息框都没有出现。

套接字.h:

#include <winsock.h>

#pragma comment(lib, "ws2_32.lib")

SOCKET s;
WSADATA w;
#define MY_MESSAGE_NOTIFICATION      1048

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    MessageBox(hwnd, (LPCWSTR)L"Test1", (LPCWSTR)L"Test1", MB_OK);
    switch (message)
    {
    case MY_MESSAGE_NOTIFICATION:
        {
            switch (lParam)
            {
            case FD_ACCEPT:
                break;
            case FD_CONNECT:
                MessageBox(hwnd,(LPCWSTR)L"Test2",(LPCWSTR)L"Test2",MB_OK);
                break;
            case FD_READ:
                char buffer[80];
                memset(buffer, 0, sizeof(buffer)); 
                recv (s, buffer, sizeof(buffer)-1, 0); 
                MessageBox(hwnd, (LPCWSTR)buffer, (LPCWSTR)L"Captured Text…", MB_OK);
                break;
            case FD_CLOSE:
                break;
            }
        }
        break;
    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
}

int ListenOnPort(int portno)
{
    int error = WSAStartup (0x0202, &w);
    if (error)
    {
        return false;
    }
    if (w.wVersion != 0x0202)
    {
        WSACleanup ();
        return false;
    }
    SOCKADDR_IN addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons (portno);
    addr.sin_addr.s_addr = htonl (INADDR_ANY);  
    s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET)
    {
        return false;
    }
    if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)
    {
        return false;
    }
    listen(s, SOMAXCONN);
    WSAAsyncSelect (s, GetConsoleWindow(), MY_MESSAGE_NOTIFICATION, (FD_ACCEPT | FD_CONNECT |
         FD_READ | FD_CLOSE));
}

最佳答案

您要告诉 WSAAsyncSelect() 将消息发送到您不拥有的 HWND。除非您手动子类化该窗口并将 WndProc() 连接到它,否则 WndProc() 永远不会收到套接字消息。您需要创建自己的 HWND。并确保您的代码中也有消息循环,否则您的 HWND 将永远不会收到消息。

关于c++ - 异步 Winsock 服务器的 WndProc 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22111509/

相关文章:

windows - Windows 上的 Beanstalk : How do I prevent commands running on re-deployment?

python - urlopen 在 Python 2.7 中工作,但在 Python 3.4 中失败

c++ - 检测笔记本电脑插接或未插接 Windows 7+

android - 在 Android 4.2.2 和 4.3 上关闭 BluetoothSocket 时出现致命信号 11 SIGSEGV

sockets - channel 的golang问题(缓冲与非缓冲)

c++ - 如何调用基于特定派生类的方法

c++ - 将 shared_ptr 或 unique_ptr 传递给 _beginthreadex

c# - 从流的开头读取一些字节而不改变 C# 中的位置

c++ - 如何在 cmake 中要求没有二进制文件的仅 header 库?

c++ - 如何在 C++ 中修复动态数组中的 "Out of Memory"