我有这个简单的服务器,5个客户端可以连接到。现在的问题是我如何决定谁在进行谈话呢? 它适用于一个客户端,因为它使用相同的 i 进行读取和发送。当有2个客户端连接时,我想发送一些与发送该消息的客户端相关联的唯一ID,以便下次发送消息时,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);
}
}
}
最好的问候。
答案 0 :(得分:2)
您知道五个客户端中的每个客户端都有自己的文件描述符连接(因为您已经单独接受了每个连接),因此您可以通过跟踪您正在使用的文件描述符来分析您正在与之通信的客户端用。对于客户端的标识,您可以使用getpeername()
查找对等名称,该名称带有套接字文件描述符和地址结构。
唯一一次,这可能会变得混乱,正如我所看到的,是套接字是由一个进程建立的,然后该进程然后分叉,多个进程最终使用该套接字。
答案 1 :(得分:1)
创建某种结构:
struct GameClient
{
int socket;
char ip_address[30];
int user_id;
//etc
};
维护std::map这些连接:
std::map<int, GameClient> current_clients;
当你从套接字sock_fd
读取时,只需获取信息:
GameClient* current_client = ¤t_clients[sock_fd];
当客户端断开连接时:
current_clients.erase(sock_fd);