我有一个抛出编译错误的Client类:
class Client {
public:
struct sockaddr_in* sa;
int roomid;
Client(struct sockaddr_in* socka, int id=0) : sa(socka), roomid(id) {}
};
错误:
chatserver.cc:37:2: note: candidate expects 2 arguments, 0 provided
chatserver.cc:33:7: note: candidate: ‘constexpr Client::Client(const Client&)’
33 | class Client {
| ^~~~~~
但是,如果我添加一个空的构造函数Client() {}
,则可以正常编译。
为什么?
编辑:
我已经精简了代码,因此更具可读性。
基本上,我初始化一个unordered_map,然后在while循环的开始,我遍历该地图以打印其内容。在循环的更下游,我在UDP套接字上侦听并将新的Client添加到映射:
unordered_map<string, Client> ip_client_map;
while (true) {
for (auto const& x : ip_client_map) {
cout << x.first << '=' << x.second.sa->sin_addr.s_addr << ':' << ntohs(x.second.sa->sin_port) << endl;
}
struct sockaddr_in src;
socklen_t srclen = sizeof(src);
char buf[1000];
int rlen = recvfrom(sockfd, buf, sizeof(buf)-1, 0, (struct sockaddr*) &src, &srclen);
buf[rlen] = 0;
string srcaddr = string(inet_ntoa(src.sin_addr)) + ":" + to_string(ntohs(src.sin_port));
struct sockaddr_in* sa = (sockaddr_in*) malloc(sizeof(struct sockaddr_in));
memcpy(sa, &src, sizeof(struct sockaddr_in));
Client new_client = Client(sa);
ip_client_map[srcaddr] = new_client;
}
旁注:每次我在while循环开始时打印unordered_map的内容时,IP地址和端口号分别为0和0,所以我认为我没有正确地复制sockaddr_in*
。 / p>