簡體   English   中英

多次綁定到同一端口

[英]Binding multiple times to the same port

有沒有辦法在同一{IP,port}上綁定多個偵聽TCP套接字? 我知道我可以打開一個套接字,進行綁定,派生,然后在每個進程中進行監聽。 但是我想對無法在綁定后派生的單獨進程執行相同的操作。 有什么方法可以允許此操作,而不會出現“地址已在使用中”錯誤?

我唯一需要的選擇是連接的自動負載平衡。

似乎有必要引入一個單獨的進程,該進程將監聽端口並充當負載平衡代理,通過環回接口或Unix套接字將流量轉發到后端進程池。 如果要使用HTTP,則可以使用現有的HTTP反向代理之一,例如poundnginx

您可以執行類似的操作,並按照此處的建議將套接字fd通過unix域套接字

不幸的是,我認為這是不可能的。

只有一個進程可以將TCP套接字綁定到給定的端口和IP地址(即使它是INADDR_ANY ),這將是完全重復的綁定 正如您已經提到的,唯一的例外是bind(2) / fork(2)舞蹈。

也就是說,如果計算機上具有多個網絡接口(或在單個接口上設置IP別名),則可以將一個套接字綁定到具有相同端口的每個IP地址。 只需記住在socket(2)bind(2)調用之間設置SO_REUSEADDR套接字選項。

負載平衡可以通過多種方式完成:

  • 在將源IP映射到機器/端口池的防火牆上執行此操作,
  • 在一個流程中進行代理/預處理,在一組流程中完成實際工作,
  • 使用@Hasturkun建議的文件描述符傳遞

對於使用內核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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM