Làm cách nào để tạo ổ cắm UDP của máy khách trong C++ để nó có thể nghe trên cổng đang được ứng dụng khác lắng nghe? Nói cách khác, làm thế nào tôi có thể áp dụng ghép kênh trong C++?Ghép kênh cổng C++ UDP
Trả lời
Tôi muốn nghe trên chỉ có một cổng
Bạn có thể làm điều đó với một sniffer. Chỉ cần bỏ qua các gói tin từ các cổng khác nhau.
tôi có thể cần để ngăn chặn nó từ việc gửi một số gói đặc biệt, bởi vì chương trình của tôi sẽ gửi nó thay cho ứng dụng ban đầu
Được rồi, ở đây tôi đề nghị bạn để loại bỏ sniffers, và sử dụng một MITM kỹ thuật.
Bạn cần phải dựa vào quy tắc tường lửa PREROUTING để chuyển hướng các gói tới ứng dụng "proxy". Giả sử UDP, Linux iptables, và "Proxy" chạy trên cùng một máy chủ, đây là những gì các "Proxy" thực sự cần phải làm:
1. Thêm quy tắc tường lửa để divert sự các gói dữ liệu (làm điều đó bằng tay, nếu bạn thích):
iptables -t nat -A PREROUTING -i <iface> -p <proto> --dport <dport>
-j REDIRECT --to-port <newport>
2. Bind và nghe trên <newport>
.
3. Rơ le tất cả lưu lượng truy cập giữa 2 điểm cuối (máy khách và đích ban đầu).Nếu bạn đang chạy "proxy" trên một máy chủ lưu trữ khác, hãy sử dụng getsockopt với SO_ORIGINAL_DST
để truy xuất địa chỉ đích ban đầu.
Nghe có vẻ phức tạp, nhưng ... vâng, đó là vì nó hơi phức tạp :-) Tham khảo tài liệu tường lửa của bạn nếu giả định của tôi phân biệt.
Tôi đoán đây chính xác là những gì tôi cần. :) Cảm ơn rất nhiều. – SkypeMeSM
Đây là không ghép - thuật ngữ được dành riêng cho việc xử lý I/O trên nhiều kênh khác nhau trong quá trình tương tự và nơi mà mọi thứ như select(2)
và poll(2)
là hữu ích nhất.
Những gì bạn đang yêu cầu là multicast. Here là ví dụ cơ bản.
Lưu ý rằng IP có một dải địa chỉ đặc biệt (nhóm a.k.a.) để phát đa hướng. Chúng được ánh xạ tới các địa chỉ ethernet đặc biệt. Người nghe sẽ phải tham gia nhóm đa hướng, trong khi người gửi không phải làm như vậy, nó sẽ gửi như bình thường.
Hy vọng điều này sẽ hữu ích.
Tôi có một ứng dụng phần mềm chạy trên cổng 5000 và tôi không thể sửa đổi ứng dụng đó để nó tham gia bất kỳ nhóm phát đa hướng nào hoặc tương tự như vậy. Tôi muốn nghe trên cùng một cổng để mã của tôi có thể phân tích cú pháp tất cả các gói nhận được bởi ứng dụng đó. Tôi đã có một khái niệm rằng điều này được gọi là 'ghép kênh', nhưng tôi không thể tìm thấy một ví dụ thích hợp cho cùng. – SkypeMeSM
Sau đó lấy Wireshark (http://www.wireshark.org/), đánh các gói dữ liệu, đổ vào một tập tin, và đi vào nó. –
Tôi đang sử dụng wireshark để xem các gói ngoại tuyến, nhưng tôi phải viết một chương trình C++ có khả năng ngửi hoặc nghe trên một cổng cụ thể chứ không phải trên tất cả các cổng và không thể ngoại tuyến được. Tôi có thể sử dụng thư viện libpcap, nhưng như tôi đã nói tôi muốn nghe chỉ trên một cổng, và tôi có thể cần dừng nó gửi một số gói tin cụ thể, vì chương trình của tôi sẽ gửi nó thay vì ứng dụng gốc !! Tôi không chắc liệu tôi có làm bạn bối rối không :) – SkypeMeSM
Đây chỉ là gói sniffing như tcpdump
hoặc snoop
, mở ổ cắm thô và kéo mọi thứ từ dây và bộ lọc theo yêu cầu của bạn. Có thể bạn sẽ muốn sử dụng libpcap để làm mọi việc dễ dàng hơn một chút.
Không có đặc quyền của quản trị viên hoặc người dùng siêu, bạn sẽ cần ứng dụng đích để mở cổng với SO_REUSEADDR
và SO_REUSEPORT
khi thích hợp cho nền tảng. Thông báo trước là bạn chỉ có thể nhận các gói broadcast và multicast, các gói unicast được gửi tới socket mở đầu tiên.
Ok. Vì vậy, theo ý kiến của bạn, lựa chọn duy nhất khác là sử dụng libpcap để sniff mỗi gói trên một giao diện mạng và sau đó lọc ra các gói tin cho cổng cụ thể đó. Tôi đã nghĩ rằng vì đây là những gói UDP (kết nối ít), nó không phải là một vấn đề để thụ động/chủ động gửi/nhận gói tin trên cùng một cổng. – SkypeMeSM
Tôi đã thử, Linux chỉ gửi đến ổ cắm đầu tiên, nó không ghép các gói unicast. Các nền tảng khác có thể nhưng không có khả năng khác nhau vì lý do hiệu suất. –
- 1. Cổng nguồn khách hàng UDP trong C?
- 2. Gọi lại ghép kênh
- 3. Có thể ghép nhiều kênh thành một kênh không?
- 4. Điểm nóng ghép kênh trong Android
- 5. Ghép kênh làm tài nguyên trong XAML
- 6. Chuyển tiếp cổng UDP cho trình giả lập Android; "adb forward udp: cổng udp: cổng" và telnet localhost adb_port không hoạt động
- 7. Sử dụng đúng cách ghép kênh trong Dapper
- 8. Lồng ghép cặp thẻ mục nhập kênh ExpressionEngine trong một cặp thẻ mục nhập kênh khác?
- 9. Bộ ghép kênh đầu cuối miễn phí tốt là gì?
- 10. Nhận cổng ngẫu nhiên cho ổ cắm UDP
- 11. Nghe trên TCP và UDP trên cùng một cổng
- 12. Làm thế nào để thiết lập cổng nguồn trong ổ cắm UDP trong c?
- 13. Máy chủ kênh dữ liệu WebRTC cho khách hàng Giao tiếp UDP
- 14. Nghe cho TCP và UDP yêu cầu trên cùng một cổng
- 15. Ghép số nguyên trong C#
- 16. Lồng ghép Prolog với C#
- 17. Framework mạng cho C++ (UDP hoặc TCP)?
- 18. Lỗ UDP Đột
- 19. SPDY có khác biệt so với http ghép kênh để giữ kết nối còn sống
- 20. Sự khác nhau giữa HTTP pipeling và ghép kênh HTTP với SPDY
- 21. Python và UDP nghe
- 22. Torrent DHT udp
- 23. Tại sao iOS ngăn chặn ràng buộc với cổng UDP 6785 (IN_ADDRANY)?
- 24. Ổ cắm TCP và UDP có thể sử dụng cùng một cổng không?
- 25. Sự khác nhau giữa bộ điều hợp kênh và mẫu cổng nhắn tin là gì?
- 26. Cách lấy số cổng từ addrinfo trong unix c
- 27. Phát UDP trong Java
- 28. Ghép nối Bluetooth trong C trên Linux
- 29. Chuỗi ghép trong C#include filename
- 30. Đọc tài liệu ghép trong C#
Tại sao bạn làm điều đó? – jweyrich
Ghép kênh chỉ hữu ích nếu đầu kia của ổ cắm đang mong đợi dữ liệu được kết hợp (trừ khi bạn đang cố gắng "giả mạo" dữ liệu mà đầu kia mong đợi). – dreamlax
Tôi đoán tôi phải giải thích kịch bản tốt hơn một chút. Tôi có một ứng dụng đang chạy trên cổng 5000. Tôi muốn nghe trên cùng một cổng, để tôi có thể nhận và phân tích tất cả các gói mà ứng dụng đang nhận. Tôi nghĩ rằng tôi có thể sử dụng SO_REUSEADDR tùy chọn để ràng buộc các ổ cắm, nhưng WAITS này cho các ứng dụng ban đầu để đóng trước khi chương trình của tôi nhận được các gói tin trên cùng một cổng. Tôi hy vọng câu hỏi và hành vi mong muốn là rõ ràng ngay bây giờ. Cảm ơn vì đã trả lời. – SkypeMeSM