2010-10-07 88 views
5

如何在C++中創建客戶端UDP套接字,以便它可以監聽其他應用程序正在監聽的端口?換句話說,我如何在C++中應用端口複用?C++ UDP套接字端口多路複用

+0

你爲什麼要那樣做? – jweyrich 2010-10-07 02:56:55

+0

複用僅在套接字的另一端期望複用數據(除非您試圖「僞造」另一端期望的數據)時纔有用。 – dreamlax 2010-10-07 03:12:35

+0

我想我必須更好地解釋這種情況。我有一個運行在端口5000上的應用程序。我想在同一個端口上偵聽,以便我可以接收和解析應用程序正在接收的所有數據包。我認爲我可以使用SO_REUSEADDR選項來綁定套接字,但是在我的程序在同一個端口上接收數據包之前,這個WAITS使原始應用程序關閉。我希望現在這個問題和理想的行爲是清楚的。感謝回覆。 – SkypeMeSM 2010-10-07 03:44:50

回答

3

我要聽只有一個端口上

你可以做到這一點與嗅探器。只要忽略來自不同端口的數據包。

我可能需要從發出一些特定的數據包阻止它,因爲我的程序將改爲發送它的原始應用程序的

好了,在這裏我建議你放棄嗅探器,並使用MITM技術。

你需要依靠PREROUTING防火牆規則來轉移的數據包發送到「代理」應用程序。假設UDP,Linux和iptables的,而「代理」在同一臺主機上運行,​​這裏是什麼「代理」實際上需要做的:

添加防火牆規則來轉移的包(做手工,如果你喜歡):

iptables -t nat -A PREROUTING -i <iface> -p <proto> --dport <dport> 
    -j REDIRECT --to-port <newport> 

2.綁定和監聽<newport>

3.轉發2個端點(客戶端和原始目的地)之間的所有通信。如果您在其他主機上運行「代理」,請使用getsockoptSO_ORIGINAL_DST來檢索原始目標地址。

這可能聽起來很棘手,但是......是的,那是因爲它有點棘手:-) 如果我的假設不一致,請參閱防火牆文檔。

+0

我想這正是我需要的。 :) 非常感謝。 – SkypeMeSM 2010-10-07 05:51:13

1

這是不多路複用 - 該術語被保留以供在同一進程在多個信道上處理I/O,並且其中之類的東西select(2)poll(2)是最有用的。

你要求的是multicast。基本示例爲Here

請注意,IP爲多播保留了特殊範圍的地址(又名組)。這些被映射到特殊的以太網地址。聽衆將不得不加入多播組,而發件人不必,它只是照常發送。

希望這會有所幫助。

+0

我有一個運行在端口5000上的軟件應用程序,我無法修改該應用程序,以便它加入任何多播組或類似地。我想在同一端口上偵聽,以便我的代碼可以解析該應用程序接收的所有數據包。我有一個概念,這被稱爲「端口複用」,但我無法找到一個適當的例子。 – SkypeMeSM 2010-10-07 03:43:23

+0

然後拿到Wireshark(http://www.wireshark.org/),嗅探數據包,轉儲到一個文件中,然後進行處理。 – 2010-10-07 03:48:44

+0

我正在使用wireshark離線查看數據包,但我必須編寫一個C++程序,用於在特定端口上嗅探或偵聽,而不是在所有端口上,並且它不能脫機。我可以使用libpcap庫,但就像我說過的,我只想監聽一個端口,我可能需要停止發送某些特定的數據包,因爲我的程序將發送它而不是原始應用程序!我不知道我是否很困惑你:) – SkypeMeSM 2010-10-07 04:16:15

2

這只是數據包嗅探,如tcpdumpsnoop,打開原始套接字並根據需要從線路和過濾器中拉出所有內容。您可能會想要使用libpcap使事情變得更容易一些。

沒有管理員或超級用戶權限,您將需要目標應用程序根據平臺的需要打開端口SO_REUSEADDRSO_REUSEPORT。警告您只能接收廣播和多播數據包,單播數據包將傳送到第一個打開的套接字。

+0

好的。因此,在您看來,唯一的另一種選擇是使用libpcap來嗅探網絡接口上的每個數據包,然後過濾出該特定端口的數據包。我認爲,由於這些是UDP數據包(無連接),因此在同一端口上被動/主動發送/接收數據包應該不成問題。 – SkypeMeSM 2010-10-07 04:21:44

+0

我試過,Linux只交付給第一個套接字,它不復用單播數據包。由於性能原因,其他平臺可能但不會有所不同。 – 2010-10-08 01:41:59