如何在C++中創建客戶端UDP套接字,以便它可以監聽其他應用程序正在監聽的端口?換句話說,我如何在C++中應用端口複用?C++ UDP套接字端口多路複用
回答
我要聽只有一個端口上
你可以做到這一點與嗅探器。只要忽略來自不同端口的數據包。
我可能需要從發出一些特定的數據包阻止它,因爲我的程序將改爲發送它的原始應用程序的
好了,在這裏我建議你放棄嗅探器,並使用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個端點(客戶端和原始目的地)之間的所有通信。如果您在其他主機上運行「代理」,請使用getsockopt和SO_ORIGINAL_DST
來檢索原始目標地址。
這可能聽起來很棘手,但是......是的,那是因爲它有點棘手:-) 如果我的假設不一致,請參閱防火牆文檔。
我想這正是我需要的。 :) 非常感謝。 – SkypeMeSM 2010-10-07 05:51:13
這是不多路複用 - 該術語被保留以供在同一進程在多個信道上處理I/O,並且其中之類的東西select(2)
和poll(2)
是最有用的。
請注意,IP爲多播保留了特殊範圍的地址(又名組)。這些被映射到特殊的以太網地址。聽衆將不得不加入多播組,而發件人不必,它只是照常發送。
希望這會有所幫助。
我有一個運行在端口5000上的軟件應用程序,我無法修改該應用程序,以便它加入任何多播組或類似地。我想在同一端口上偵聽,以便我的代碼可以解析該應用程序接收的所有數據包。我有一個概念,這被稱爲「端口複用」,但我無法找到一個適當的例子。 – SkypeMeSM 2010-10-07 03:43:23
然後拿到Wireshark(http://www.wireshark.org/),嗅探數據包,轉儲到一個文件中,然後進行處理。 – 2010-10-07 03:48:44
我正在使用wireshark離線查看數據包,但我必須編寫一個C++程序,用於在特定端口上嗅探或偵聽,而不是在所有端口上,並且它不能脫機。我可以使用libpcap庫,但就像我說過的,我只想監聽一個端口,我可能需要停止發送某些特定的數據包,因爲我的程序將發送它而不是原始應用程序!我不知道我是否很困惑你:) – SkypeMeSM 2010-10-07 04:16:15
這只是數據包嗅探,如tcpdump
或snoop
,打開原始套接字並根據需要從線路和過濾器中拉出所有內容。您可能會想要使用libpcap使事情變得更容易一些。
沒有管理員或超級用戶權限,您將需要目標應用程序根據平臺的需要打開端口SO_REUSEADDR
和SO_REUSEPORT
。警告您只能接收廣播和多播數據包,單播數據包將傳送到第一個打開的套接字。
好的。因此,在您看來,唯一的另一種選擇是使用libpcap來嗅探網絡接口上的每個數據包,然後過濾出該特定端口的數據包。我認爲,由於這些是UDP數據包(無連接),因此在同一端口上被動/主動發送/接收數據包應該不成問題。 – SkypeMeSM 2010-10-07 04:21:44
我試過,Linux只交付給第一個套接字,它不復用單播數據包。由於性能原因,其他平臺可能但不會有所不同。 – 2010-10-08 01:41:59
- 1. UDP C套接字:共享單個端口的多個套接字
- 2. 套接字UDP一個套接字,不同的端口
- 3. 將UDP套接字綁定到多個端口
- 4. Java套接字UDP環路
- 5. UDP套接字和多個回覆
- 6. 如何在c中的UDP套接字中設置源端口?
- 7. 多UDP套接字偵聽同一端口上的特定源
- 8. C++多UDP套接字數據處理
- 9. 在UDP套接字上查找接口
- 10. 「已連接」UDP套接字接收ICMP端口不可達
- 11. 針對多個客戶端的C#.NET UDP套接字異步
- 12. UDP - 原始套接字 - C#
- 13. C#中的UDP套接字?
- 14. 多個UDP端口
- 15. 使用Java套接字處理不可達UDP端口
- 16. TCP和UDP套接字可以使用相同的端口嗎?
- 17. 使用node.js子進程共享UDP套接字/端口
- 18. TCP套接字到多個IP /端口
- 19. UDP套接字
- 20. Java套接字 - 套接字端口
- 21. 多端口監聽套接字linux
- 22. 客戶端服務器udp套接字
- 23. Unix域套接字,Udp套接字Objective C使用什麼?
- 24. 同一端口套接字上的多個連接C++
- 25. 客戶端UDP套接字綁定
- 26. 接收錯誤與UDP套接字(C++)
- 27. C /如何偵聽多個UDP端口
- 28. 開幕Boost.Asio的UDP套接字與臨時端口
- 29. 如何將UDP套接字綁定到一系列端口
- 30. 在udp套接字上設置源端口
你爲什麼要那樣做? – jweyrich 2010-10-07 02:56:55
複用僅在套接字的另一端期望複用數據(除非您試圖「僞造」另一端期望的數據)時纔有用。 – dreamlax 2010-10-07 03:12:35
我想我必須更好地解釋這種情況。我有一個運行在端口5000上的應用程序。我想在同一個端口上偵聽,以便我可以接收和解析應用程序正在接收的所有數據包。我認爲我可以使用SO_REUSEADDR選項來綁定套接字,但是在我的程序在同一個端口上接收數據包之前,這個WAITS使原始應用程序關閉。我希望現在這個問題和理想的行爲是清楚的。感謝回覆。 – SkypeMeSM 2010-10-07 03:44:50