1

私は現在UDPサーバーで作業しています。IPアドレスとポートを使用して、接続されているクライアントにすべての着信パケットをリダイレクトしたいと思います。私の現在のやり方は次のようになります。

class Connection;
typedef std::map<unsigned short, Connection*> PortMap;
typedef std::map<unsigned int, PortMap> AddressMap;

だから私は基本的に2つのマップを使用しています。2つ目は、ipv4アドレス(unsigned int)をキーとして使用するすべてのポートのマップを含みます。PortMapはポートをキーとして使用し、Connectionクラス(クライアント)へのポインターを含みます。

ランダムに生成されたIPとポートを使用して64のクライアントにアクセスすることで速度テストを行い、64の異なるクライアントに64回アクセスするのに〜(編集:0.4ミリ秒)かかりました。遅いかどうかはよくわかりません。もちろん、それは私がテストを実行しているシステムに依存します。

アドレスを使用してクライアントにアクセスする方法は次のとおりです。

Client * GetClient(Address address)
{
    AddressMap::iterator ipIt;
    PortMap::iterator portIt;
    unsigned int ip = address.GetAddress();
    unsigned short port = address.GetPort();

    /// Does the ip exist?
    if((ipIt = clientAddresses.find(ip)) == clientAddresses.end())
    {
        return NULL;
    }

    /// Does the port exist?
    if(clientAddresses[ip].find(port) == clientAddresses[ip].end())
    {   
        return NULL;
    }

    return clientAddresses[ip][port];
}

誰かがそれを行う別のより速い方法を知っていますか?

4

2 に答える 2

0

400msかかる地図への64回のアクセスは恐ろしく遅いように聞こえます...測定値を確認してください。NATは特定のIPの下でクライアントを組み合わせることができるため、マップはおそらくIPとポートの組み合わせ(個別ではない)に基づいている必要があります。

于 2012-11-14T15:43:39.247 に答える
0

たぶん、IPとポートを組み合わせたほうがいいでしょう。

ポート<65535。キーを取得できます:IP * 65535 +ポート、すべてのポートとIPで一意になります。

速度について:たとえば、N個のIPがあり、各IPにはM個のポートがあります。

マップの検索には効率的なNlog(N)があるため、検索にはN * M * log(N)* log(M)が必要です。IPとポートを1つのキーに組み合わせると、効率的にN * M * log(N * M)になります。log(N * M)= log(N)+ log(M)<log(N)* log(M)、大きなN、Mの場合。

だから、もっといいと思います。

于 2012-11-14T16:27:30.587 に答える