使用Python嗅探组播IPV6 UDP数据报,需要发送吗?

时间:2016-07-21 08:41:38

标签: python sockets networking ipv6 multicast

我写了一段很大程度上受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()

0 个答案:

没有答案