Генератор пакетов в Ткинтере

Привет, ребята,
Я надеюсь, что вы можете мне помочь. Извините за мой английский, это не мой родной язык. Я новичок в программировании и застрял в своем первом проекте. Я пытаюсь запрограммировать простой генератор трафика данных с помощью Tkinter и Python 2.7.
Я использую библиотеку dpkt в качестве основы для отправки пакетов. В начале я написал скрипт, который я могу запустить в терминале, и он работает совершенно нормально.

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

На следующем шаге я попытался создать графический интерфейс, чтобы сделать его более удобным и полезным для других пользователей. Поэтому я создал маску в Tkinter, где я могу ввести IP-адрес, выбрать размер и количество пакетов. Далее я хочу вариант, который я могу выбрать тип пакета (ICMP/UDP). Код для отправки UDP-пакетов я хочу добавить позже как функцию.

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()

Проблема в том, что когда я нажимаю "отправить", в терминале не происходит никакой реакции. Я не понимаю, почему скрипт не запускается. Это мой первый код, и я работаю над этим уже довольно давно. Я, вероятно, немного отклоняюсь, но надеюсь, что вы поможете мне и расскажете, в чем проблема. Большое вам спасибо уже. Alex

1 ответ

Скрипт работает отлично, его нужно всего лишь настроить кнопкой. Вероятно, вам нужно выделить кнопку, когда на ней есть мышь, используйте что-то вроде activebackground или же activeforeground

Я проверил через tcpdump или вы можете использовать wireshark на удаленном IP, куда вы отправляете пакет.

Другие вопросы по тегам