Verbessrungsverschläge zu meinem Programm

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Hey, wir hatten letztens das Thema in der Schule, ob Computer in einem Netzwerk mit unterschiedlicher Subnetzmaske korrespondieren. Dafür habe ich ein kleines Programm geschrieben. Allerdings denke ich das ich viele Sachen unsauber gelöst habe und das ganze auch fehleranfällig ist. Daher wollte ich euch mal fragen, ob ihr mal drüber lesen könntet und mir Verbesserungen nennen könnt oder wie ich etwas vereinfachen könnte oder ob ich Denkfehler drin habe.

#edit: Da das ganze nur zu Lernzwecken erstellt wurde und nie wirklich eingesetzt wird von mir, habe ich das Exception handling weg gelassen.

Hier mal als Beispiel veranschaulicht, wie der Abgleich erfolgen soll.

Code: Alles auswählen

192.168.13.15/255.255.0.0

11000000.10101000.00001101.00001111 IPv4 in Binärdarstellung
&&&&&&&&.&&&&&&&&.&&&&&&&&.&&&&&&&& Verknüpfung der Binärzahlen mit AND
11111111.11111111.00000000.00000000 Subnetztmaske in Binärdarstellung

11000000.10101000.00000000.00000000 Netz-ID 1



192.168.11.2/255.255.0.0

11000000.10101000.00001011.00000010 IPv4 in Binärdarstellung
&&&&&&&&.&&&&&&&&.&&&&&&&&.&&&&&&&& Verknüpfung der Binärzahlen mit AND
11111111.11111111.00000000.00000000 Subnetztmaske in Binärdarstellung

11000000.10101000.00000000.00000000 Netz-ID 2



11000000.10101000.00000000.00000000 Netz-ID 1
11000000.10101000.00000000.00000000 Netz-ID 2

Passt
und hier der Code zu meinem Skript:

Code: Alles auswählen

def convert_int_to_binar(number):
    return f"{number:08b}"

def ip_to_binary(ip_adress):
    ip_in_binary = []
    seperated_ip = ip_adress.split(".")
    for byte in seperated_ip:
        ip_in_binary.append(convert_int_to_binar(int(byte)))
    return "".join(ip_in_binary)
        
def get_subnetmask_bits(binary_subnetmask):
    return binary_subnetmask.count("1")
    
def knot_ip_bits_and_subnetmask_bits_with_and(ip, subnetmask):
    net_id = []
    ip_in_binary = ip_to_binary(ip)
    subnetmask_in_binary = ip_to_binary(subnetmask)
    for index, x in enumerate(ip_in_binary):
        if x == "1" and subnetmask_in_binary[index] == x:
            net_id.append("1")
        else:
            net_id.append("0")
    return "".join(net_id)
    
def compare_net_id(first_net_id, second_net_id, subnetmask):
    print(first_net_id[:get_subnetmask_bits(ip_to_binary(subnetmask))])
    print(second_net_id[:get_subnetmask_bits(ip_to_binary(subnetmask))])
    if first_net_id[:get_subnetmask_bits(ip_to_binary(subnetmask))] == second_net_id[:get_subnetmask_bits(ip_to_binary(subnetmask))]:
        print("YES")
    else:
        print("NO")
    
def main():
    ip_first_computer = input("Bitte die IP des ersten Rechners eingeben: ")
    subnetmask_first_computer = input("Bitte die Subnetzmaske des ersten Rechners eingeben: ")
    ip_second_computer = input("Bitte die IP des zweiten Rechners eingeben: ")
    subnetmask_second_computer = input("Bitte die Subnetzmaske des zweiten Rechners eingeben: ")
    compare_net_id(knot_ip_bits_and_subnetmask_bits_with_and(ip_first_computer, subnetmask_first_computer),
                    knot_ip_bits_and_subnetmask_bits_with_and(ip_second_computer,subnetmask_second_computer),
                    subnetmask_first_computer)
        
if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Hast Du Dir schon das ipaddress-Modul angeschaut?
Bei Masken würde man direkt mit den 32Bit-Integer-Zahlen rechnen.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Okay, habe mir jetzt das ipaddress Modul angeschaut....hätte ich aber besser vorher mal gemacht. Danke für den Tip.
Antworten