我正在編寫一個C程序,其中服務器偵聽一個衆所周知的端口,等待客戶端連接,然後創建一個隨機端口供客戶端使用並將此端口號發送回客戶端。我的主要困難是如何創建一個「隨機」端口。我應該使用srand並創建一個隨機的4位數端口是可用範圍嗎?還是有更好的方法來做到這一點?我知道,如果我使用端口0,將爲我選擇一個端口,但這裏的問題是,我不認爲我可以「看到」端口的實際值,以便我可以發回此端口號給客戶。創建隨機可用端口
謝謝...
我正在編寫一個C程序,其中服務器偵聽一個衆所周知的端口,等待客戶端連接,然後創建一個隨機端口供客戶端使用並將此端口號發送回客戶端。我的主要困難是如何創建一個「隨機」端口。我應該使用srand並創建一個隨機的4位數端口是可用範圍嗎?還是有更好的方法來做到這一點?我知道,如果我使用端口0,將爲我選擇一個端口,但這裏的問題是,我不認爲我可以「看到」端口的實際值,以便我可以發回此端口號給客戶。創建隨機可用端口
謝謝...
綁定端口0是解決方案。它給你一個任意的端口,而不是一個隨機的端口,但這是許多應用程序所做的(例如FTP等)。
綁定後,您可以使用getsockname
找出您得到的端口。
隨機的4位端口檢查,以確保它不是在使用中用於該目的OK ..
從技術上講,這聽起來像你想實現這個爲了增加安全性(某種原始端口敲門程序)?值得一提的是,這種方法通常不被認爲太安全。它也會對您一次可以服務的客戶端數量產生一些人爲限制,並且實際上會在服務器上增加不必要的負載。爲什麼不只是聽所有客戶的單一知名端口?
我猜測TCP考慮你的操作系統的監聽和自動端口分配的描述。在這種情況下,你不需要擔心它。一旦你接受了TCP連接,雙方的操作系統都會照顧你想要做的所有事情,並且你還剩下一個工作連接,隨時可以使用。除非你自己有特殊的理由去做這件事,它已經爲你做了。
你所做的是bind()
端口設置爲0.系統將分配一個。然後使用getsockname()
來發現系統分配的端口。將其發送回客戶端。這樣就沒有競爭條件,你可以按照任何系統規則進行端口分配。
「互聯網號碼分配機構(IANA)建議動態或私人端口的範圍爲49152至65535。」 http://en.wikipedia.org/wiki/Ephemeral_port – tMC 2012-02-13 21:05:46