2017-11-29 4 views
-1

"スニッフィングを開始する"を押すとパケットをスニッフィングしてコンソールに出力し、スニッフィングを停止するとスニッフィングを停止するプログラムを作成しようとしています。相続人は、私が書いたコード:私はscapyでスニッフィングを開始するとTkinterがクラッシュする

from tkinter import * 
from scapy.all import * 
from scapy.arch.windows.compa import * """Adds stop_filter to sniff because 
its not in scapy-python3""" 
root = Tk() 
Switch = False 
def stopbutton(): 
    global Switch 
    Switch = True 
def stopsniffing(x): 
    global Switch 
    return Switch  
def action(packet): 
    try: 
     print ("%s went to %s"%(packet[IP].src, packet[IP].dst)) 
    except: 
    pass 
def startsniffing(): 
    sniff(filter="host 192.168.0.48", prn=action, stop_filter=stopsniffing) 
button = Button(text="Start sniffing", command=startsniffing).pack() 
button2 = Button(text="Stop sniffing", command=stopbutton).pack() 
root.mainloop() 

私の問題は、私が押したときにスタートがそれを盗聴ということですが盗聴を開始するために開始されますが、他のすべてが応答しなくなります。

+0

でそれをしなければならない

Widget(...).pack() 

それをスキップすることができます - カント:システムからキー/マウスイベントを取得し、ウィジェットにイベントを送信し、ウィジェットを再描画するので、フリーズするように見えます。スニッフィングコードを実行するにはトレッドを使用する必要があります。 – furas

+0

btw:エラーが発生していないので、「except:pass」は使用しないでください。少なくともメッセージを表示する。 '例外をe:print(e)'とする以外は – furas

答えて

0

sniff()は長時間実行するため、システムからキー/マウスイベントを取得し、イベントをウィジェットに送信し、ウィジェットを再描画してフリーズするように見えるようになりました(mainloop())。 sniff()を実行するには、threadingを使用する必要があります。

ところで
import tkinter as tk 
from scapy.all import * 
from scapy.arch.windows.compa import * 
"""Adds stop_filter to sniff because its not in scapy-python3""" 
import threading 

# --- functions --- 

def sniffing(): 
    print('DEBUG: before sniff') 
    #sniff(filter="host 192.168.0.48", prn=action, stop_filter=stop_sniffing) 
    sniff(prn=action, stop_filter=stop_sniffing) 
    print('DEBUG: after sniff') 

def action(packet): 
    try: 
     print("%s went to %s" % (packet[IP].src, packet[IP].dst)) 
    except Exception as e: 
     print(e) 

def stop_sniffing(x): 
    global switch 
    return switch 

# --- 

def start_button(): 
    global switch 
    global thread 

    if (thread is None) or (not thread.is_alive()): 
     switch = False 
     thread = threading.Thread(target=sniffing) 
     thread.start() 
    else: 
     print('DEBUG: already running') 

def stop_button(): 
    global switch 

    print('DEBUG: stoping') 

    switch = True 

# --- main --- 

thread = None 
switch = False 

root = tk.Tk() 

tk.Button(root, text="Start sniffing", command=start_button).pack() 
tk.Button(root, text="Stop sniffing", command=stop_button).pack() 

root.mainloop() 

あなたがvar = Widget(...).pack()を行うならば、あなたはvarpack()/grid()/place()ために戻っNoneNoneを割り当てます。あなたがvarを必要としないなら、あなたはその後、can'trunをメインループあなたがvarが必要な場合、あなたはあなたが実行時間の長いコードを実行するときに、2つのライン

var = Widget(...) 
var.pack() 
関連する問題