擅长:python、mysql、java
<p>实际上你就快到了。在</p>
<p><code>udphead</code>元组的第三个元素是UDP数据的长度。您应该将其转换为本机格式(<code>socket.ntohs</code>),然后将其与IP报头长度和UDP报头长度一起使用,从<code>packet.</code>中选择一个片段,如下所示:</p>
<pre><code>...
# Convert source address to string:
source_addr = socket.inet_ntop(socket.AF_INET, source_addr)
udp_header_length = 8
source_port = socket.ntohs(udphead[0])
dest_port = socket.ntohs(udphead[1])
udp_payload_length = socket.ntohs(udphead[2])
udp_payload_start = iph_length + udp_header_length
udp_payload = packet[udp_payload_start: udp_payload_start + udp_payload_length]
print("\nSource IP address: ", source_addr)
print("Destination Port: ", dest_port)
print("Message: ", udp_payload.decode())
</code></pre>
<p>以下是几点注意事项:</p>
<ul>
<li>这里的信息被认为是文本。当然,并非所有的UDP数据报都由文本组成。在</li>
<li>一个UDP数据报不需要全部都放在一个IP数据包中,所以您不一定能得到全部数据(但是,99%的UDP数据报都能容纳在一个IP数据报中,所以您可以忽略它)</li>
<li>你还没有适应IPv6,在IPv6中,IP报头有不同的格式。您需要查看<code>version_ihl</code>字节来区分。在</li>
</ul>
<p>由于您正在使用python实现这一点,您可能需要研究一下<code>scapy</code>,这是一个为方便地编码和解码网络包而设计的库。在</p>