哪个客户正在说话?

我有5个客户端可以连接到这个简单的服务器。 现在问题是我该如何决定谁在说话? 它适用于一个客户端,因为它读取和发送使用相同的 。 当有2个客户端连接时,我想发送一些与发送该消息的客户端相关联的唯一ID,以便在下次发送消息时,ID应该与珍贵消息相同。

连接,发送和接收完成的服务器代码的小片段。

while (true) { this->readingSockets = this->openSockets; this->socketBind = select(getdtablesize(), &this->readingSockets, NULL, NULL, (struct timeval *)NULL); if (FD_ISSET(sD, &this->readingSockets)) { cD = accept(sD, (struct sockaddr *)&this->clientAdr,(socklen_t*) &this->sCadr); FD_SET(cD, &this->openSockets); continue; } for (int i=0; i<getdtablesize(); i++) if (i != sD && FD_ISSET(i, &this->readingSockets)) { this->socketBind = read(i, this->buf, sizeof(buf)); g1.cast(buf,id);//where i'd like to send that unique id if (this->socketBind == 0) { FD_CLR(i, &this->openSockets); close(i); } else { send(i,g1.getA(),g1.getSize(),0); g1.setMsg(c); } } } 

最好的祝福。

您知道每个客户端都有自己的文件描述符连接(因为您已经分别接受了每个连接),因此您可以通过跟踪正在使用的文件描述符来分析您正在与之通话的客户端。 对于客户端的身份,可以使用getpeername()来查找对等名称, getpeername()使用套接字文件描述符和地址结构。

就像我看到的那样,唯一的一次可能会变得混乱,就是如果套接字是由一个进程建立的,那么这个进程就会分叉,并且多个进程最终使用这个套接字。

创建某种结构:

 struct GameClient { int socket; char ip_address[30]; int user_id; //etc }; 

维护这些连接的std :: map :

 std::map<int, GameClient> current_clients; 

当你从套接字sock_fd读取时,只需要获取info:

  GameClient* current_client = &current_clients[sock_fd]; 

当客户端断开时:

 current_clients.erase(sock_fd);