通过ip访问类

时间:2012-11-14 15:40:26

标签: c++ sockets ip

我目前正在研究UDP服务器。 我想通过使用IP地址和端口将所有传入的数据包重定向到连接的客户端。 我目前的做法是这样的:

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

所以我基本上使用了两张地图。第二个包含使用ipv4地址(unsigned int)作为密钥的所有端口的映射。 PortMap使用端口作为键,它包含指向Connection类(客户端)的指针。

我通过使用随机生成的ips和端口访问64个客户端来对其进行速度测试,并且花了〜( EDIT :0.4毫秒)来访问64个不同的客户端64次。 我真的不知道它是否缓慢。当然这取决于我正在运行测试的系统。

以下是我使用地址访问客户端的方式:

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];
}

有没有人知道另一种更快的方式吗?

2 个答案:

答案 0 :(得分:0)

64次进入地图需要400毫秒听起来非常慢......检查你的测量结果。您的地图应该基于IP和端口的组合(不是单独的),因为NAT可以在特定IP下组合客户端。

答案 1 :(得分:0)

将IP和端口结合起来可能会更好..

港口&lt; 65535.您可以获得密钥:IP * 65535 +端口,它对于所有端口和IP都是唯一的。

关于速度:例如我们有N Ip,每个IP有M个端口。

搜索到地图有效率N log(N),因此您的搜索采用N * M * log(N)* log(M)。 如果将IP和端口合并为一个密钥,则效率为N * M * log(N * M)。 log(N * M)= log(N)+ log(M)&lt; log(N)* log(M),对于大N,M ..

所以,我认为它会更好。