C++ Win32套接字
我有一个多线程客户端应用程序的工作套接字控制台服务器。我只创建了控制台或OpenGL应用程序。因此,windows应用程序是新的 我正在将stocket服务器代码移植到Win32 API应用程序,遇到了一些问题。服务器运行,客户端之间正确连接和通信,但服务器窗口冻结 从我的屏幕截图中,您可以看到我的服务器消息正在输出到我的文本框中。但当到达msg循环时,应用程序冻结 我已从更新了我的消息循环C++ Win32套接字,c++,visual-studio,winapi,C++,Visual Studio,Winapi,我有一个多线程客户端应用程序的工作套接字控制台服务器。我只创建了控制台或OpenGL应用程序。因此,windows应用程序是新的 我正在将stocket服务器代码移植到Win32 API应用程序,遇到了一些问题。服务器运行,客户端之间正确连接和通信,但服务器窗口冻结 从我的屏幕截图中,您可以看到我的服务器消息正在输出到我的文本框中。但当到达msg循环时,应用程序冻结 我已从更新了我的消息循环 while (GetMessage(&msg, NULL, 0, 0)) { Trans
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
到
accept是一个阻塞函数,它会等待连接完成。
建议:将accept循环放在一个线程中
Windows需要取消阻止消息循环。当某个东西阻塞它时,如accept,应用程序将冻结。因此,让消息循环不受任何阻塞。accept是一个阻塞函数,它会等待建立连接。
建议:将accept循环放在一个线程中
Windows需要取消阻止消息循环。当某个东西阻塞它时,如accept,应用程序将冻结。因此,让消息循环不受任何阻塞。mmm这很有意义。。我试图避免创建用于侦听Connetion的线程,因为这是一个专为侦听Connetion而设计的应用程序。我是否错过了检查连接是否正在等待的功能,或者线程是执行此操作的唯一/最佳方式?有select,但您必须在循环中调用它。还有一个WSAAsyncSelect,它在连接就绪时将消息发布到您的窗口——实际上,它与线程一样,这是最简单的方法。建议:开始看看Windows是如何工作的,它与Unix有很大不同。如果您想将非阻塞套接字操作直接合并到UI中,WSAAsyncSelect是正确的选择。否则,请改为在后台执行操作,使用单独的线程、重叠的I/O、I/O完成端口等。谢谢大家,我现在将所有套接字代码放在线程中。我可能会在以后的某个日期,经过更多的研究后,将其重写为异步。嗯,这是有道理的。。我试图避免创建用于侦听Connetion的线程,因为这是一个专为侦听Connetion而设计的应用程序。我是否错过了检查连接是否正在等待的功能,或者线程是执行此操作的唯一/最佳方式?有select,但您必须在循环中调用它。还有一个WSAAsyncSelect,它在连接就绪时将消息发布到您的窗口——实际上,它与线程一样,这是最简单的方法。建议:开始看看Windows是如何工作的,它与Unix有很大不同。如果您想将非阻塞套接字操作直接合并到UI中,WSAAsyncSelect是正确的选择。否则,请改为在后台执行操作,使用单独的线程、重叠的I/O、I/O完成端口等。谢谢大家,我现在将所有套接字代码放在线程中。在进一步研究之后,我可能会在以后将其重写为异步AcceptEx@RbMm您的首选是异步还是线程?我的背景是PHP,所以需要一段时间才能再次习惯严格的c。但对于您来说,这可能是硬使用异步套接字api和AcceptEx@RbMm您的首选是异步还是线程?我的背景是PHP,所以需要一段时间才能再次习惯严格的c。但对你来说,这可能很难
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.
}