Trên Linux bạn sử dụng một ổ cắm PF_PACKET để đọc dữ liệu từ một thiết bị thô, chẳng hạn như một giao diện ethernet chạy ở chế độ promiscuous:
s = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
này sẽ gửi bản sao của tất cả các gói tin nhận được lên đến ổ cắm của bạn. Nó là khá có khả năng rằng bạn không thực sự muốn tất cả các gói tin, mặc dù. Nhân có thể thực hiện mức lọc đầu tiên bằng BPF, Berkeley Packet Filter. Về cơ bản, BPF là một máy ảo dựa trên stack: nó xử lý một tập hợp nhỏ các hướng dẫn như:
ldh = load halfword (from packet)
jeq = jump if equal
ret = return with exit code
Mã thoát BPF cho hạt nhân biết có nên sao chép gói vào ổ cắm hay không. Có thể viết trực tiếp các chương trình BPF tương đối nhỏ, sử dụng setsockopt (s, SOL_SOCKET, SO_ATTACH_FILTER,). (CẢNH BÁO: Hạt nhân lấy cấu trúc sock_fprog, không phải là cấu trúc bpf_program, không trộn lẫn chúng lên hoặc chương trình của bạn sẽ không hoạt động trên một số nền tảng).
Đối với mọi thứ phức tạp, bạn thực sự muốn sử dụng libpcap. BPF được giới hạn trong những gì nó có thể làm, đặc biệt là trong số lượng các hướng dẫn nó có thể thực hiện cho mỗi gói. libpcap sẽ xử lý việc tách một bộ lọc phức tạp thành hai phần, với hạt nhân thực hiện mức lọc đầu tiên và mã không gian người dùng có khả năng hơn sẽ giảm các gói mà nó không thực sự muốn xem.
libpcap cũng tóm tắt giao diện hạt nhân ra khỏi mã ứng dụng của bạn. Linux và BSD sử dụng các API tương tự, nhưng Solaris yêu cầu DLPI và Windows sử dụng một cái gì đó khác.
Trong Linux? Bài viết của bạn không chỉ ra hệ điều hành, nhưng chúng ta nên giả sử bằng cách sử dụng của bạn 'root' bạn có nghĩa là Linux? – GEOCHET
yep, vì vậy thẻ tôi đoán – jbleners