Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Win32套接字_C++_Visual Studio_Winapi - Fatal编程技术网

C++ Win32套接字

C++ Win32套接字,c++,visual-studio,winapi,C++,Visual Studio,Winapi,我有一个多线程客户端应用程序的工作套接字控制台服务器。我只创建了控制台或OpenGL应用程序。因此,windows应用程序是新的 我正在将stocket服务器代码移植到Win32 API应用程序,遇到了一些问题。服务器运行,客户端之间正确连接和通信,但服务器窗口冻结 从我的屏幕截图中,您可以看到我的服务器消息正在输出到我的文本框中。但当到达msg循环时,应用程序冻结 我已从更新了我的消息循环 while (GetMessage(&msg, NULL, 0, 0)) { Trans

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

我正在将stocket服务器代码移植到Win32 API应用程序,遇到了一些问题。服务器运行,客户端之间正确连接和通信,但服务器窗口冻结

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

我已从更新了我的消息循环

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.
}