使用 ICE 进程间通信时, IP 和端口的选择
服务器在创建时使用的 Endpint 格式为
tcp -h IP 地址 -p 端口
1 、 IP 地址的选择
如果填某个网卡的地址,则只在这个地址上监听,客户端必须连这个 IP 才能连通,通常情况下,不同机器之间互相调用一般用 0.0.0.0 ,表示在所有网卡上监听
如果只在同一机器上不同进程之间通信,建议服务器监听 IP 使用 127.0.0.1 ,客户端在连接时也用 127.0.0.1 ,这样的好处是,默认防火墙不会弹出是否允许的警告
2 、端口的选择
一般情况下,服务器创建的服务的 IP 是固定的,所以端口号可以直接固定写死,这样才能保证客户端知道如何找到服务器
特殊情况下,为防止端口被占用,服务器也可指定端口号为 0 ,让系统分配一个空闲的端口来起服务,然后服务器将该端口记录在特定位置( e.g. 共享内存),客户端先从中取到端口后再连接服务器并调用
当指定端口为 0 时,系统分配一个空闲端口,获取端口的代码如下
Ice::CommunicatorPtr g_communicator; void startMyIce() { g_communicator = Ice::initialize(); Ice::ObjectAdapterPtr adapter = g_communicator->createObjectAdapterWithEndpoints( " WsICEService " , " tcp -h 127.0.0.1 -p 0 " ); Ice::EndpointSeq es = adapter-> getEndpoints(); Ice::EndpointInfoPtr eip = es[ 0 ]-> getInfo(); Ice::IPEndpointInfoPtr ipeip = dynamic_cast<Ice::IPEndpointInfo*> (eip._ptr); int nport = ipeip-> port; std:: string sip = ipeip-> host; }