C ++术语不评估带0参数线程套接字的函数

时间:2014-04-16 13:13:39

标签: c++ multithreading winsock

最近,我一直在努力创建一个接受多个客户端的套接字服务器。我正在使用基本线程(我不想使用boost库)。但我每次都得到错误'term does not evaluate to a function taking 0 arguments thread sockets',这是因为线程。如果我评论线程,它确实有效。

有谁可以帮助我?

以下是代码:

#include <WinSock2.h>
#include <stdio.h>
#include <thread>

#define BUFFER_SIZE 1024

class TcpClient {
private:
    SOCKET s;
    SOCKADDR_IN a;
    std::thread t;
public:
    TcpClient(SOCKADDR_IN addr, SOCKET client) {
        this->s = client;
        this->a = addr;

        this->t = std::thread(&TcpClient::receiving_func);
        this->t.join();
    }

    void receiving_func(void* v) {
        for (;;) {
            char* data = new char[BUFFER_SIZE];
            int bytes = recv(this->s, data, BUFFER_SIZE, 0);
            std::string raw = std::string(data);
            raw = raw.substr(0, bytes);
            printf_s("Received %s\n", raw);
        }
    }
};

1 个答案:

答案 0 :(得分:4)

receiving_func(void* v)需要1个参数,但std::thread(&TcpClient::receiving_func);需要一个零参数的函数。你认为v会在函数中出现什么?

您可以std::thread(&TcpClient::receiving_func, NULL);编译(并设置v == NULL),或者由于您未使用v,只需将其从方法签名中删除即可。

此外,由于receiving_func是一个对象方法(它不是静态的),这是一个问题,因为无法识别this值。您可能希望将函数设为静态,使其参数为TcpClient *,并使用std::thread(&TcpClient::receiving_func, this);创建线程,最后使用该参数访问对象成员而不是this(如静态方法没有this