Làm cách nào để gửi gói UDP từ giao diện cụ thể trên Linux bằng C? Tôi có nên sử dụng bind? Có thể gửi UDP từ giao diện không có địa chỉ IP không?Làm cách nào để gửi gói UDP từ một giao diện cụ thể trên Linux?
Cảm ơn.
Làm cách nào để gửi gói UDP từ giao diện cụ thể trên Linux bằng C? Tôi có nên sử dụng bind? Có thể gửi UDP từ giao diện không có địa chỉ IP không?Làm cách nào để gửi gói UDP từ một giao diện cụ thể trên Linux?
Cảm ơn.
Bạn có thể gắn một ổ cắm để một giao diện cụ thể bằng cách sử dụng tùy chọn SO_BINDTODEVICE
ổ cắm, tuy nhiên điều này đòi hỏi phải có quyền root.
Cách khác, bạn có thể đặt tùy chọn IP_PKTINFO
và sử dụng sendmsg
để gửi, đặt in_pktinfo
's ipi_ifindex
vào chỉ mục giao diện của bạn.
Sử dụng liên kết. Bạn không thể gửi gói UDP thông qua giao diện không có địa chỉ IP, vì UDP sử dụng Giao thức Internet và Giao thức Internet yêu cầu địa chỉ IP.
Bạn cần sử dụng tùy chọn socket IP_MULTICAST_IF.
Xem ở đây: Multicast-HOWTO-6.html
Nó sẽ không chỉ hoạt động cho phát đa hướng? (Ngoài ra, dường như yêu cầu một địa chỉ) – Hasturkun
Bạn không biết: nó là một cách crossplatform? Ví dụ. nó có hoạt động theo cách này trên Windows® không? –
@ Hi-Angel: Tôi chưa thử, nhưng rõ ràng bạn có thể sử dụng [IPPROTO_IP'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms738586 (v = vs .85) .aspx) Tùy chọn ổ cắm 'IP_UNICAST_IF' trên Windows. Tùy chọn này có một chỉ mục giao diện và cũng nên hoạt động trên các hệ thống Linux hiện tại (được thêm vào năm 2012 và hiện diện trong Linux v3.4). – Hasturkun
Hmm, thú vị ... Tôi không tìm thấy đề cập về tùy chọn trong tài liệu GNU/Linux, nhưng tìm thấy [một lưu ý ngắn] (http://kernelnewbies.org/Linux_3.4) rằng nó đã được thêm vào để giúp dự án WINE. Tôi hy vọng dự án WINE nhận thức được điều đó: D –