C++ Win32 套接字

标签 c++ visual-studio winapi

我有一个带有多线程客户端应用程序的工作套接字控制台服务器。我只创建了控制台或 OpenGL 应用程序。所以 Windows 应用程序是新的。

我正在将我的 stocket 服务器代码移植到 Win32 API 应用程序,但遇到了一些麻烦。服务器运行,客户端相互连接和通信正确,但服务器窗口卡住。

从我的屏幕截图中,您可以看到我的服务器消息正在输出到我的文本框。但是在到达 msg 循环时,应用程序卡住了。

我已经从

更新了我的消息循环
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

boolean running = TRUE;

while (running) {
    if (PeekMessage(&sys.msg, NULL, 0, 0, PM_REMOVE)) {
        if (sys.msg.message == WM_QUIT)
        {
            running = FALSE;
            //exitCode = msg.wParam;
            break;
        }
        TranslateMessage(&sys.msg);
        DispatchMessage(&sys.msg);
    }

    try {
        pseucode_socket_checking();
    }
    catch (std::exception& e) {
        running = FALSE;
    }
}


pseucode_socket_checking() {
    SOCKET incoming = INVALID_SOCKET;
    incoming = accept(server_socket, NULL, NULL);

    if (incoming == INVALID_SOCKET) return;

    ...

    // create thread for socket.
}

enter image description here

最佳答案

accept() 是一个阻塞函数,它会等待连接建立。 建议:将您的 accept() 循环放在一个线程中。

Windows 需要消息循环畅通无阻。当有东西卡住时(比如 accept()),应用程序将卡住。因此,让消息循环不受任何阻塞。

关于C++ Win32 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57109474/

相关文章:

C++ 指向使用随机指针归档的其他类对象的指针 vector

visual-studio - Visual Studio 2019 内存分析器工具将托管堆中的所有对象列为“未知”

c++ - 在 C++ 中检索 Windows 中的菜单项列表

c++ - 即使未选中复选框,也可以使用 DateTimePicker 控件检索日期

delphi - 为什么在 Delphi XE2 64 位中 HKEY_ 常量为 "Constant expression violates subrange bounds"?

c++ - 在单个 slot_type 上使用多个 boost::connect 的内存泄漏

c++ - 将 "Program Files"设置为 Qt Installer Framework 中的默认安装目录

c++ - 为什么我们需要 std::initializer_list 的私有(private)构造函数?

c# - 如何记录一条消息以便我可以在 VS2013 中看到它?

visual-studio - Visual Studio : Single solution or many solutions?