gevent を使用してマルチスレッドで動作するプログラムを作成しようとしています。
プログラムはパケットを生成し、scapy で構築し、raw_socket を使用して送信します。そのようです:
def worker(...):
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
s.bind((iface, socket.htons(0x0800)))
packet = fragment(Ether()/IP(dst=dst, src=str(src))/TCP(dport=dport, sport=sport)/pay_load, fragsize=100)
data = [piece.build() for piece in packet]
for packet in data:
s.send(packet)
コードは順番に問題なく実行されますが、gevent を使用してスレッドを生成すると、with で失敗し [piece.build() for piece in packet]
ます"WARNING: Child died unexpectedly. Packets may have not been sent 30405"
。
私ができる最善の推測は、何らかの形Packet.build
で Scapy がスレッド化されていないことです。回避策またはパケットを生成する別の方法を手伝ってくれる人はいますか?