import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while True:
print(s.recvfrom(65565)) # OSError: [WinError 10022] 提供了一個無效的參數
s.recvfrom(65535) # 最大合法值
import socket
import struct
# 建立原始 Socket (捕獲所有 IP 封包)
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind(("0.0.0.0", 0)) # 綁定所有介面
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) # 包含 IP 標頭
# 啟用混雜模式 (SIO_RCVALL)
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
try:
while True:
# 緩衝區 65535
data, addr = s.recvfrom(65535)
print(f"從 {addr} 收到 {len(data)} 位元組")
# 這裡解析 IP/TCP/UDP 標頭...
except KeyboardInterrupt:
pass
finally:
# 關閉混雜模式
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
s.close()
WinError 10022 核心原因是 **`recvfrom` 緩衝區參數超過 65535** 且 **缺乏管理員權限/混雜模式設定**。修正參數、提權、正確 `ioctl` 開啟混雜模式,或直接改用 **Scapy/psutil** 等高階函式庫,避免造輪子踩坑。