我目前正在研究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];
}
有没有人知道另一种更快的方式吗?
答案 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 ..
所以,我认为它会更好。