【问题标题】:Python - socket.recvfrom() get entire IP/UDP packet?Python - socket.recvfrom() 获取整个 IP/UDP 数据包?
【发布时间】:2016-07-21 12:13:08
【问题描述】:

有没有办法使用socket.recvfrom(buf) 获取所有IP 和UPD 数据? 具体来说,我想知道 udp 标头(源端口、目标端口、长度、应用程序数据)以及 ip 细节:它来自什么 ip,发送到什么地址?

片段:

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)
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)

while True:
    udp_data,ip_sender = sock.recvfrom(4000)
    #Only returns udp data field and ip of sender

我在 Windows 上,并且使用 socket.SOCK_RAW 挂起(?)有任何解决方法吗?

【问题讨论】:

  • 是的,你是对的,需要使用RAW_SOCKET
  • recvfrom返回的第二个值实际上是一个包含发送者IP地址和端口的元组(例如('192.168.4.135', 37754))。

标签: python sockets udp ipv6


【解决方案1】:

使用

sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', DEST_PORT))

sock.setsockopt(socket.IPPROTO_IPV6, socket.IP_HDRINCL, 1)

在加入多播之前,grp 似乎有效!

【讨论】:

    猜你喜欢
    • 2019-02-27
    • 1970-01-01
    • 2017-05-13
    • 2011-03-30
    • 2020-06-28
    • 1970-01-01
    • 2012-03-03
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多