带有 winsock 和 std::thread 的 C++ 多线程服务器

Posted

技术标签:

【中文标题】带有 winsock 和 std::thread 的 C++ 多线程服务器【英文标题】:C++ multithreaded server with winsock and std::thread 【发布时间】:2013-06-06 18:11:22 【问题描述】:

我在添加 thread 模块时遇到了一些问题:

#include <thread>

对绑定函数的调用给了我错误:

错误 3 错误 C2440: '=' : 无法从 'std::_Bind<_forced>' 转换为 'int' c:\users\ ohadpeled\documents\visual studio 2012\projects\loginserver\loginserver\server.cpp 87 1 LoginServer 4 IntelliSense:不存在从“std::_Bind”到“int”的合适转换函数 c:\Users\OhadPeled\Documents\Visual Studio 2012\Projects\LoginServer\LoginServer\Server.cpp 87 20 LoginServer

我不明白为什么它会导致这个错误,不包括线程模块调用工作正常。如果有人能解释一下是什么原因,我会很高兴。

这是服务器类的一部分:

            /* Set TCP listening socket */
            ListenResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); // Error in this line
            if (ListenResult != SOCKET_ERROR) 
            
                freeaddrinfo(result);

                ListenResult = listen(ListenSocket, SOMAXCONN);
                if (ListenResult != SOCKET_ERROR) 
                
                    /* Accepting clients */
                    while(true)
                    
                        ClientSocket = new SOCKET();
                        ADDR = new SOCKADDR_IN();
                        ADDRSize = sizeof(*ADDR);
                        *ClientSocket = accept(ListenSocket, (struct sockaddr*)ADDR, &ADDRSize);
                        if (*ClientSocket != INVALID_SOCKET) 
                        
                            /* I want to thread the handler function over here! */
                            Handler(ClientSocket, ADDR);
                        
                    
                
            

我用的是win7,用winsock设置socket。

【问题讨论】:

如果您需要 Windows 上的最高性能,您应该使用 I/O 完成端口。如果您的服务器适用于多平台,请使用boost::asio 【参考方案1】:

问题在于编译器将bind 符号解析为C++ 函数std::bind(),而不是WinSock 函数bind()。为了解决此问题,您可以执行以下两项操作之一:

    删除源文件中的所有using namespace std; 声明;或

    使用作用域解析运算符:: 显式引用全局命名空间中的bind 函数:

    ListenResult = ::bind(...);
    

【讨论】:

谢谢!我尝试了一些丑陋的东西来让它工作......有趣的是 g++ 根本不被打扰,但 Visual Studio 是......

以上是关于带有 winsock 和 std::thread 的 C++ 多线程服务器的主要内容,如果未能解决你的问题,请参考以下文章

tcp 服务器的奇怪行为(使用 winsock)

std::thread 使用带有 ref arg 的 lambda 编译失败

带有 std::thread 的 MVSE12 中的错误 C2248

在带有标志选项 -m32 的 gcc-8.2.2 上找不到 std::thread。我正在使用 mingw

如何在 freeRTOS 上使用 std::thread?

暂停和恢复 std::thread 的正确方法