最近,我一直在努力创建一个接受多个客户端的套接字服务器。我正在使用基本线程(我不想使用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);
}
}
};
答案 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
。