使用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; }