Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python原始套接字读取完整数据包_Python_Sockets - Fatal编程技术网

使用python原始套接字读取完整数据包

使用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

我正在尝试使用转发表为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 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'