Tôi đang viết mã để gửi khung Ethernet thô giữa hai hộp Linux. Để kiểm tra điều này, tôi chỉ muốn nhận một máy khách đơn giản gửi và nhận máy chủ.Ổ cắm ethernet nguyên linux liên kết với giao thức cụ thể
Tôi có ứng dụng khách tạo gói dữ liệu một cách chính xác (tôi có thể xem chúng bằng cách sử dụng gói sniffer).
Về phía server tôi khởi tạo các ổ cắm như vậy:
fd = socket(PF_PACKET, SOCK_RAW, htons(MY_ETH_PROTOCOL));
nơi MY_ETH_PROTOCOL
là 2 byte liên tục tôi sử dụng như một EtherType vì vậy tôi không nghe lưu lượng mạng không liên quan.
khi tôi gắn ổ cắm này để giao diện của tôi, tôi phải vượt qua nó một giao thức một lần nữa trong struct socket_addr: socket_address.sll_protocol = htons(MY_ETH_PROTOCOL);
Nếu tôi biên dịch và chạy mã như thế này thì nó không thành công. Máy chủ của tôi không thấy gói. Tuy nhiên, nếu tôi thay đổi mã như vậy:
socket_address.sll_protocol = htons(ETH_P_ALL);
Máy chủ có thể xem gói được gửi từ máy khách (cũng như nhiều gói khác), vì vậy tôi phải kiểm tra gói để xem gói khớp với số MY_ETH_PROTOCOL
.
Nhưng tôi không muốn máy chủ của mình nghe lưu lượng truy cập không được gửi trên giao thức được chỉ định nên đây không phải là giải pháp. Làm thế nào để tôi làm điều này?
Bạn có thể dán mã nơi bạn thiết lập 'socket_address' của mình không? – bstpierre