使用 winsock 和 std::thread 的 C++ 多线程服务器

标签 c++ multithreading sockets winsock

我在包含 thread 模块时遇到一些问题,当我添加时:

#include <thread>

对绑定(bind)函数的调用给我错误:

Error 3 error C2440: '=' : cannot convert from 'std::_Bind<_Forced,_Ret,_Fun,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,>' to 'int' c:\users\ohadpeled\documents\visual studio 2012\projects\loginserver\loginserver\server.cpp 87 1 LoginServer 4 IntelliSense: no suitable conversion function from "std::_Bind" to "int" exists 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。

最佳答案

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

  1. 删除所有 using namespace std; 源文件中的声明;或
  2. 使用范围解析运算符:: 显式引用全局命名空间中的bind 函数:

    ListenResult = ::bind(...);
    

关于使用 winsock 和 std::thread 的 C++ 多线程服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16969175/

相关文章:

c++ - 以 C++ 样式复制结构中的缓冲区

java - Apache Ignite 中单个分区上的 ScanQuery 是单线程还是多线程?

c++ - 多线程 C++ 将参数传递给函数

java - 取消被 Socket.Accept() 阻止的 SwingWorker?

javascript - 回调函数socket.io + node.js

c++ - 二进制文件脱机排序失败

c++ - 使用 Autotools 插件从 Eclipse 调用 autoreconf 时出错

c++ - 带有 std :out_of_range issue (C++) 的简单密码

multithreading - 线程计算OCaml

c++ - 用于构建 Web 协议(protocol)的资源