使用python raw socket读取完整数据包

时间:2018-05-05 13:00:25

标签: 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 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()读取一个完整的数据包?

1 个答案:

答案 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