如何在Python中从TCP套接字读取完整的IP帧?
我想用Python从TCP流套接字中读取一个完整的(原始的)IP帧。简单来说,我想要一个没有任何修改的帧,就像它直接从物理线路上来的那样,包括所有的头部信息。
我一直在研究Python中的原始套接字,但遇到了一些问题。我不需要自己构造数据包,我只需要逐字读取并转发它们。
那么,我该如何从现有的TCP套接字中读取整个IP帧(包括头部)呢?
最好是只使用标准库。另外,我是在Linux主机上。
谢谢!
3 个回答
0
你可以试试 scapy 这个工具。
0
也许 pylibpcap 可以做到这一点。
3
如果你不介意使用Scapy这个库(它不是标准库的一部分),而且对速度要求不高,你可以用它的sniff
函数。这个函数需要一个回调函数。大概是这样的:
pkts_rxd = []
def process_and_send(pkt):
pkts_rxd.append(pkt)
sendp(pkt, 'eth1')
sniff(prn=process_and_send, iface='eth0', count=100)
你可以在不同的线程或进程中运行这个sniff,设置count=0
,这样它就可以一直运行下去,把收到的数据包放到一个队列里。如果你这样做,记得把str(pkt)
放到队列里。我见过把scapy的数据包放到multiprocessing.Queue
里时出现奇怪的问题。
Debian和Ubuntu的apt软件库里都有Scapy。我不太清楚rpm发行版的情况。不过,从源代码安装其实也很简单:只需要运行./setup.py install
。