2

我有这个简单的服务器,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);
                }
            }
    }

此致。

4

2 回答 2

2

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

正如我所看到的,唯一可能会变得混乱的是,如果套接字是由一个进程建立的,并且该进程然后分叉并且多个进程最终使用该套接字。

于 2012-10-28T14:42:00.467 回答
1

创建某种结构:

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

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

std::map<int, GameClient> current_clients;

当您从 socket 读取时sock_fd,只需获取信息:

 GameClient* current_client = &current_clients[sock_fd];

当客户端断开连接时:

current_clients.erase(sock_fd);
于 2012-10-28T18:21:49.017 回答