[英]Binding multiple times to the same port
有沒有辦法在同一{IP,port}上綁定多個偵聽TCP套接字? 我知道我可以打開一個套接字,進行綁定,派生,然后在每個進程中進行監聽。 但是我想對無法在綁定后派生的單獨進程執行相同的操作。 有什么方法可以允許此操作,而不會出現“地址已在使用中”錯誤?
我唯一需要的選擇是連接的自動負載平衡。
您可以執行類似的操作,並按照此處的建議將套接字fd通過unix域套接字
不幸的是,我認為這是不可能的。
只有一個進程可以將TCP套接字綁定到給定的端口和IP地址(即使它是INADDR_ANY
),這將是完全重復的綁定 。 正如您已經提到的,唯一的例外是bind(2)
/ fork(2)
舞蹈。
也就是說,如果計算機上具有多個網絡接口(或在單個接口上設置IP別名),則可以將一個套接字綁定到具有相同端口的每個IP地址。 只需記住在socket(2)
和bind(2)
調用之間設置SO_REUSEADDR
套接字選項。
負載平衡可以通過多種方式完成:
對於使用內核3.9的linux來說似乎是“新的可能” http://freeprogrammersblog.vhex.net/post/linux-39-introdued-new-way-of-writing-socket-servers/2
通過使用SO_REUSEPORT
為了使您的任務更加專業,在Linux上,您可以使用netfilter的隊列模塊將傳入的數據包映射到您的進程中。 然后,您可以刪除/修改/它們。
prog1: checks if packet came from IP xxx.xxx.xxx. Match? Catch packet.
prog2: checks if prog3 busy. Match? Catch packet.
prog3: checks packet's origin...
但是,這導致大約20Kb的代碼僅用於處理數據包,並且您的TCP / IP堆棧無法長期保存(大流量==大錯誤)。
在Windows上,您可以使用Winsock驅動程序來實現相同的目的。
這是一個絕妙的解決方案,只需創建一個調度程序進程來分叉其他進程。 照看nginx或apache2或cometd或任何Perl的異步TCP模塊都可以理解這個想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.