2016-05-10 11 views
1

Hallo Leute,
Ich hoffe, du kannst mir helfen. Sorry für mein Englisch, es ist nicht meine Muttersprache. Ich bin neu im Programmieren und stecke in meinem ersten Projekt fest. Ich versuche, einen einfachen Datenverkehrsgenerator mit Tkinter und Python 2.7 zu programmieren.
Ich verwende die dpkt-Bibliothek als Basis für das Senden von Paketen. Am Anfang habe ich ein Skript geschrieben, das ich im Terminal ausführen kann und es funktioniert ganz gut.
Packet Generator in Tkinter

import dpkt 
import socket, random 

# input 
ip_dst = raw_input('IP-address of destination: ') 
n = input('number of packets 2^n: ') 
num =2**(n) 
# packet size 
b = input('size of packets (number between 1 and 5950): ') 
while (b<1 or b>5950): 
    print('Invalid number!') 
    b = input('size of packets (number between 1 and 5950): ') 
# script for sending packets 
z=0 
while z<=num: 
    print z 
    echo = dpkt.icmp.ICMP.Echo() 
    echo.id = random.randint(0,0xffff) 
    echo.seq = random.randint(0,0xffff) 

    echo.data = 'hello world'*b     # changing size with factor b 

    icmp = dpkt.icmp.ICMP() 
    icmp.type = dpkt.icmp.ICMP_ECHO 
    icmp.data = echo 

    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, dpkt.ip.IP_PROTO_ICMP) 
    s.connect((ip_dst,1))       # ip-address of destination 
    sent = s.send(str(icmp)) 
    print 'sent %d bytes' %sent 
    z=z+1 

In meinem nächsten Schritt habe ich versucht, eine GUI zu erstellen es handlicher und auch verwendbar für andere Benutzer zu machen. Also habe ich in Tkinter eine Maske erstellt, wo ich die IP-Adresse eingeben kann, die Größe und die Anzahl der Pakete auswähle. Weiter möchte ich die Option, dass ich den Pakettyp (ICMP/UDP) auswählen kann. Der Code zum Senden von UDP-Paketen, die ich später als Funktion hinzufügen möchte.

from Tkinter import * 
import ttk 
import tkFont 
import dpkt 
import socket, random 

sent_packets = 0 

# send icmp 
def send_icmp(sent_packets, s1,ip_dst): 
    while (sent_packets<=n): 
     print sent_packets 
     echo = dpkt.icmp.ICMP.Echo() 
     echo.id = random.randint(0,0xffff) 
     echo.seq = random.randint(0,0xffff) 

     echo.data = 'hello world'*(s1) 

     icmp = dpkt.icmp.ICMP() 
     icmp.type = dpkt.icmp.ICMP_ECHO 
     icmp.data = echo 

     s = socket.socket(socket.AF_INET, socket.SOCK_RAW, dpkt.ip.IP_PROTO_ICMP) 
     s.connect((ip_dst,1)) 
     sent = s.send(str(icmp)) 
     print 'sent %d bytes' %sent 
     sent_packets += 1 
     mainWin.update() 


mainWin= Tk() 
mainWin.title('Traffic Generator') 
mainWin.columnconfigure (0, weight=1) 
mainWin.rowconfigure(0, weight=1) 

ip_dst = StringVar() 

# Frame settings 
mainFrame = Frame(mainWin, width=200, height=100) 
mainFrame.grid_propagate(0) 
mainFrame.grid() 
mainFrame.columnconfigure(0, weight=1) 
mainFrame.columnconfigure(1, weight=1) 
mainFrame.columnconfigure(2, weight=1) 
mainFrame.rowconfigure(0, weight=1) 
mainFrame.rowconfigure(1, weight=1) 
mainFrame.rowconfigure(2, weight=1) 
mainFrame.rowconfigure(3, weight=1) 


# Headline 
label_1 = Label(mainWin, text="Traffic Generator", font="Helvetica 11 bold") 
label_1.grid(column=0, row=0, padx=15, pady=5, sticky=(N,W), columnspan=2) 

# Input 

# IP-address: 
label_2 = Label(mainWin, text="Please enter IP-address of destination: ", font=tkFont.Font(family="Helvetica", size=10)) 
label_2.grid(column=0, row=1, padx=15, pady=5, sticky=(N,W)) 

entry_1 = Entry(mainWin, textvariable=ip_dst, width=13) 
entry_1.grid(column=1, row=1, padx=15, pady=5, sticky=(N,E)) 
entry_1.focus() 

# type: 
label_4 = Label(mainWin, text="Select packet type: ", font=tkFont.Font(family="Helvetica", size=10)) 
label_4.grid(column=0, row=2, padx=15, pady=5, sticky=(N,W)) 
type = IntVar() 
Radiobutton(mainWin, text="ICMP", variable=type, value="send_icmp").grid(row=2, column=1, sticky=(N,W), padx=15, pady=5, columnspan=2) 
Radiobutton(mainWin, text="UDP", variable=type, value="send_udp").grid(row=2, column=1, sticky=(N,W), padx=70, pady=5, columnspan=2) 

# size: 
label_3 = Label(mainWin, text="Select packet size: ", font=tkFont.Font(family="Helvetica", size=10)) 
label_3.grid(column=0, row=3, padx=15, pady=5, sticky=(N,W)) 

size1 = IntVar() 
size_slide1 = Scale(mainWin, from_=1, to=5900, orient='horizontal', variable= size1, length=200, resolution=10, showvalue=0) 
size_slide1.set(3000) 
size_slide1.grid(column=1, row=3, padx=15, pady=5, sticky=(N,E)) 

s1= str(size1) 

Label(mainWin, textvariable= size1).grid(column=2, row=3, padx=15, pady=5, sticky=(N,E)) 


# number: 
label_4 = Label(mainWin, text="Select number of packets: ",font=tkFont.Font(family="Helvetica", size=10)) 
label_4.grid(column=0, row=4, padx=15, pady=5, sticky=(N,W)) 

num1 = int() 
Label(mainWin, text="2^n packets: ", font=tkFont.Font(family="Helvetica", size=10)).grid(column=1, row=4, padx=15, pady=5, sticky=(W,E)) 
num_slide1 = Scale(mainWin, from_=1, to=500, orient='horizontal', variable = num1, length=200, resolution=2, showvalue=0) 
num_slide1.set(32) 
num_slide1.grid(column=1, row=5, padx=15, pady=5, sticky=(N,E)) 
Label(mainWin, textvariable= num1).grid(column=2, row=5, padx=15, pady=5, sticky=(N,E)) 
number1 = 2**(num1) 

# send: 
Button(mainWin, text="Send packets", command=type, width=13).grid(column=2, row=6) # radiobuttons select value of variable 'type' which executes selected function (e.g. def send_icmp) of selected type 


mainWin.mainloop() 

Das Problem ist, dass, wenn ich dort getroffen senden keine Reaktion im Terminal ist. Ich verstehe nicht, warum das Skript nicht läuft. Das ist mein erster Code und ich arbeite schon ziemlich lange daran. Ich mache wahrscheinlich einen kleinen Umweg, aber ich hoffe, du kannst mir helfen und mir sagen, was das Problem ist. Vielen Dank schon. Alex

Antwort

2

Das Skript läuft völlig in Ordnung, es ist einfach die Taste, die Sie müssen Sie tweak.Probably müssen Sie die Taste markieren, wenn die Maus auf sie ist, verwenden Sie so etwas wie activebackground oder activeforeground

ich über tcpdump geprüft oder Sie können wireshark auf der Remote-IP verwenden, an die Sie das Paket senden.

+0

Sry für meine späte Antwort. Ich hatte keine Zeit, mein Projekt fortzusetzen. Auch wenn ich den Button mit activebackground zwicke, bekomme ich beim Drücken von send keine Reaktion. Ist es möglich, dass Sie ein solches Skript (zum Senden von Paketen) nicht in einer Funktion ausführen können? Oder muss ich mit Klassen arbeiten? – junker1248

+0

natürlich können Sie, identifizieren Sie einfach die wichtigsten Arbeitsblöcke und erstellen 'def' für sie..und wie Sie bereits die Funktion' send_icmp' verwendet bereits modular, so dass Sie nicht viel Arbeit daran tun müssen –

+0

Vielen Dank ! Ich habe es laufen lassen. Jetzt benutze ich nur die Socket-Bibliothek zum Erstellen von Paketen, es ist viel schneller. Mein einziges Problem ist, dass ich den Typ der Pakete mit den Radiobuttons nicht wirklich ändern kann. Ist es besser, verschiedene Funktionen für jeden Typ oder nur eine Funktion mit veränderbaren Variablen über Radiobutton zu verwenden? – junker1248