Bên ngoài mở một ổ cắm riêng biệt trên mỗi giao diện như Glomek gợi ý, cách duy nhất mà tôi biết để làm được điều này dứt khoát trên Windows là sử dụng một ổ cắm nguyên, ví dụ:
SOCKET s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
Mỗi nhận được từ ổ cắm này sẽ là một IP packet, chứa cả địa chỉ nguồn và đích. Chương trình tôi làm việc trên đòi hỏi tôi phải đặt socket trong chế độ promiscuous bằng cách sử dụng tùy chọn SIO_RCVALL. Làm điều này có nghĩa là tôi nhận được mọi gói IP giao diện "nhìn thấy" trên mạng. Để trích xuất các gói một cách rõ ràng cho ứng dụng của tôi yêu cầu tôi lọc dữ liệu bằng cách sử dụng các địa chỉ và cổng trong tiêu đề IP và TCP/UDP. Rõ ràng, đó có lẽ là chi phí cao hơn bạn quan tâm. Tôi chỉ đề cập đến nó để nói điều này - Tôi chưa bao giờ sử dụng một ổ cắm thô mà không đặt nó trong chế độ promiscuous. Vì vậy, tôi không chắc chắn nếu bạn có thể liên kết nó với INADDR_ANY và chỉ sử dụng nó như một ổ cắm thông thường từ điểm đó về phía trước hay không. Dường như với tôi rằng bạn có thể; Tôi chưa bao giờ thử nó.
EDIT: Đọc này article để biết giới hạn về ổ cắm thô trên Windows. Trở ngại lớn nhất mà tôi phải đối mặt trong dự án của tôi là người ta phải là thành viên của nhóm Quản trị viên để mở một ổ cắm thô trên Windows 2000 trở lên.
Nguồn
2009-03-03 05:34:15
Cảm ơn, đây là những gì tôi đang tìm kiếm. Quá tệ nó không được mô-đun của socket Python hỗ trợ - mặc dù tôi đã chỉ định libc trong câu hỏi này. :) – Readonly