如何在Windows上使用Python在本地端口(69)上检测或捕获UDP包

2024-09-29 04:29:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试过了:

s = socket.socket(socket.AF_INET, socket.SOCK_RAW,socket.IPPROTO_IP)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
s.bind(('', 69))
while True
    try :
        databuffer, (raddress, rport) = s.recvfrom(1024)
    except socket.timeout:
        logging.error("Write timeout on socket")
        continue

但结果显示什么也没收到(没有包裹!)在数据缓冲区中。但我用的是Wireshark真的抓到了这些包! 我找到了一些解决办法:How Do I Use Raw Socket in Python? 最后一个例子展示了如何在Windows上用原始套接字编写一个非常简单的网络嗅探器。此示例需要管理员权限才能修改接口:

^{pr2}$

我的:

HOST = socket.gethostbyname(socket.gethostname())
s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_UDP)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
s.bind((HOST, 69))
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

它起作用了!但还有另一个问题:本地69号港!在

s.bind((HOST, 69))

捕获的数据包都来自端口0,但不是69!在

我想知道有没有更好的方法可以做到这一点。在

在操作系统上:WindowsServer2003R2标准版sp2-32位 python 2.7.1


Tags: iphostrawsobindsocketsockaf