我有一个带有多线程客户端应用程序的工作套接字控制台服务器。我只创建了控制台或 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.
}
最佳答案
accept()
是一个阻塞函数,它会等待连接建立。
建议:将您的 accept() 循环放在一个线程中。
Windows 需要消息循环畅通无阻。当有东西卡住时(比如 accept()),应用程序将卡住。因此,让消息循环不受任何阻塞。
关于C++ Win32 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57109474/