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
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
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 –
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