我写了一段很大程度上受mcast.py启发的代码来嗅探ipv6上的UDP数据报。然而,奇怪的事情发生了。
如果我第一次启动send()
方法,我只能看到网络上的数据包
(即在一个窗口中file.py -s
,在另一个窗口中file.py
,这允许我在指定端口上查看其他UDP数据包。但是如果我不启动file.py -s
,那么我只运行file.py
,没有数据包被嗅探。是什么赋予了?
具体来说,似乎sendto(...)
的调用是receive()
能够嗅探的原因。这个问题有方法解决吗?我只打算收听特定的UDP IPV6数据包,而不是真的发送。是因为我需要先向IPV6组播组发送加入消息,还是? (我无法在wireshark中看到任何此类数据包..)
import sys
import socket
import time
import struct
import win_inet_pton #https://pypi.python.org/pypi/win_inet_pton
SOURCE_PORT = 16000
DEST_PORT = 26000
MULTICAST_ADDR = 'ff02::1' #IPV6 Multicast Address
socket.IPPROTO_IPV6 = 41 #Workaround for missing constants on Win32 systems.
def send(): #Send packets
MY_IP6 = "fe80::8d96:ab99:7447:1c5c%11" #Link local IPV6 address..
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 1)
sock.bind((MY_IP6, SOURCE_PORT))
while True:
sock.sendto("foo", (MULTICAST_ADDR, DEST_PORT))
#Needed to be able to receive packets..?
time.sleep(0.2)
def receive(): #Receive packets
addrinfo = socket.getaddrinfo(MULTICAST_ADDR, None)[0]
sock = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', DEST_PORT))
#Join Multicast grp.
group = socket.inet_pton(addrinfo[0], addrinfo[4][0])
mreq = group + struct.pack('@I', 0) # Magic?
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
while True:
d , s = sock.recvfrom(4000)
print str(s) + " " + repr(d)
if __name__ == "__main__":
if len(sys.argv) >= 2:
if sys.argv[1] == "-s":
send()
else:
receive()