2014-06-23 66 views
-2

我有一個C++主程序調用兩個子進程。這兩個子進程通過主程序分配的TCP端口連接。找到一個免費的TCP端口和升壓ASIO

我看到使用情況下找到一個空閒端口是程序將嘗試綁定在給定的端口,如果返回「失敗」,給一個端口++,然後再試一次。

對於我的情況,我需要在我的主程序中決定哪個端口號應該傳遞給這兩個子進程。

那麼有沒有一種簡單的方法來檢查端口是否可以使用而不嘗試綁定到它?

port = 1234 
while(port < 1299) 
    if(port is bindable) 
    call to subprocesses 
    break; 
    else 
    port++ 
+3

您可能面臨的邊緣情況:您檢查該端口是否空閒並傳遞它,但是在子進程啓動之前綁定到其他進程並將其盜取。 – user2802841

回答

3

找到自由港的正確的辦法是讓操作系統選擇一個可用的端口爲您服務。創建一個套接字並將其綁定到端口0,然後查詢套接字以找出實際綁定的端口。每個主流操作系統都支持該功能在Boost ASIO中完成這個特殊語法的時候,我沒有任何線索。

然後,你必須解決每個端口在使用中實際存在的問題一旦被束縛,所以你必須要麼:

  1. 使主程序創建和綁定2個插槽,然後通過現有套接字可供子進程使用。

  2. 使子流程創建並綁定自己的本地套接字,並啓用SO_REUSEADDR套接字選項,以便它們可以綁定到主程序綁定的相同端口(即使主程序在啓動之前關閉了綁定套接字子過程)。

  3. 使子進程獲取自己的端口(通過綁定到端口0),然後將實際的端口號報告回主程序,然後根據需要將其傳遞給子進程。

1

我看到通常情況下找到一個免費的端口是該程序將嘗試在特定端口綁定,如果是返回「失敗」,給一個端口++,然後再試一次。

不,它不是。我不知道你在哪看到的,但通常正確的情況是指定端口0並讓操作系統執行此操作,然後使用getsockname()來發現操作系統分配的端口。

相關問題