2

5つのクライアントが接続できるこの単純なサーバーがあります。問題は、現在誰が話しているかをどのように判断するかということです。同じiを使用して読み取りと送信を行うため、1 つのクライアントに対して機能します。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);
                }
            }
    }

よろしくお願いします。

4

2 に答える 2

2

5つのクライアントのそれぞれが、独自のファイル記述子に独自の接続を持っていることを知っているので(各接続を個別に受け入れたため)、作業しているファイル記述子を追跡することで、通信しているクライアントを分析できます。クライアントのIDについてはgetpeername()、ソケットファイル記述子を使用するピア名とアドレス構造を検索できます。

私が見ているように、これが厄介になる可能性があるのは、ソケットが1つのプロセスによって確立され、そのプロセスがフォークと複数のプロセスがそのソケットを使用する場合のみです。

于 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 に答える