2017-11-29 11 views
-1

"스니핑 시작"을 누르면 패킷을 스니핑하고 콘솔로 출력하고 "스니핑 중지"를 누르면 스니핑을 중지하는 프로그램을 작성하려고합니다. . Heres는 코드는 내가 쓴 :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

에 그것을해야 다음 var이 필요하면 당신은

Widget(...).pack() 

를 건너 뛸 수 있습니다 - 시스템에서 키/마우스 이벤트를 가져오고, 이벤트를 위젯에 보내고, 위젯을 다시 그립니다. 따라서 화면이 정지 된 것처럼 보입니다. 스니핑 코드를 실행하려면 트레드를 사용해야합니다. – furas

+0

btw : 오류가 발생하지 않으므로'except : pass'를 사용하지 마십시오. 최소한 메시지를 표시하십시오. '예외를 e로 제외 : print (e)' – furas

답변

0

sniff()은 장기 실행 기능이므로 시스템에서 키/마우스 이벤트를 가져오고 이벤트를 위젯에 보내고 위젯을 다시 그리기 때문에 프로그램이 멈추는 것처럼 보입니다. sniff()을 실행하려면 threading을 사용해야합니다. BTW


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()을 할 경우
당신은 var pack()/grid()/place() 때문에 반환 NoneNone을 할당합니다. 당신이 var이 필요하지 않은 경우 다음 can'trun을 주회 돌이 코드를 장기 실행 실행할 때 두 라인

var = Widget(...) 
var.pack()