我正在尝试使用转发表为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()
读取一个完整的数据包?
答案 0 :(得分:0)
我也不是原始套接字编程方面的专家,但我对网络有一定的了解。
第一个问题:
如何知道我读完的数据包不是50%还是1个半包?
答案:你不能。它没有"序列号"或"确认号码"喜欢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