使用python原始套接字读取完整数据包
我正在尝试使用转发表为UDP数据包创建一个只用于IP转发的原始套接字。我不擅长原始套接字编程,我关心的是如何确保缓冲区中有完整的UDP数据包使用python原始套接字读取完整数据包,python,sockets,Python,Sockets,我正在尝试使用转发表为UDP数据包创建一个只用于IP转发的原始套接字。我不擅长原始套接字编程,我关心的是如何确保缓冲区中有完整的UDP数据包 import socket s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP) s.bind(('0.0.0.0', 1337)) while True: packet = s.recvfrom(65535) #how to know that I read
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
s.bind(('0.0.0.0', 1337))
while True:
packet = s.recvfrom(65535) #how to know that I read the complete packet not 50% or 1 and half packet
forwared_packet_function(packet) #here I will parse the packet change ip header and update the IP table and forward the packet
可以告诉我如何通过
recvfrom()
读取一个完整的数据包吗 我也不是原始套接字编程方面的专家,但我有一些网络方面的知识
第一个问题:
如何知道我读的是完整的数据包不是50%还是1.5%的数据包
回答:你不能。它没有像TCP那样的“序列号”或“确认号”
第二个问题:
可以告诉我如何通过recvfrom()读取一个完整的数据包吗
回答:让我们试试
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
s.bind(('0.0.0.0', 1337))
while True:
packet = s.recvfrom(65535).decode() #decode packet
forwared_packet_function(packet)
print(packet) #print packet to read
但在这种情况下,如果缓冲区不包含完整的UDP数据包,它和我转发一个或多个数据包的一部分,它将导致错误?它不会在转发时出错。也许它会在其他方面出错。这取决于你将转发或接收什么类型的数据包。如果您的数据包是语音,它将有一些丢失的语音。如果你的数据包是SETUP.exe,肯定会出错。家庭路由器如何做到这一点而不丢失数据。所以不可能编写NAT在python中所做的程序?正如我所说的,它在转发时不会出现任何错误。但它有时可能会丢失,因为它是UDP。请了解QoS以最大限度地减少数据包丢失。这是Python中的NAT示例,这给了我一个错误:
AttributeError:'tuple'对象没有属性'decode'