Jak wysłać surową ramkę ethernetową w Pythonie
Muszę zrobić projekt w ciągu kilku dni, jego podstawowy interfejs klienta i serwera. Chwyt polega na tym, że muszą to być wszystkie surowe gniazda. Nie mam problemu z jego utworzeniem, po prostu utknąłem przy wysyłaniu pakietów.
Najpierw próbowałem powiązać go z interfejsem „en1”, ale nadal daje mi błądnodename not known
. Kiedy łączę go z moim lokalnym adresem IP, działa dobrze. Po wykonaniu tego stworzyłem surową klasę pakietów, wszystko w hex. Następnie zadzwoniłem do Sendto, aby wysłać go na przewód.
Problem polega na tym, że gdy przechwytuję pakiet za pomocą wireshark, pojawia się on jako ładunek pakietu ipv4. Nie chcę, żeby automatycznie tworzyła nagłówki, tak właśnie była moja klasa pakietów surowych. Czy wiesz, w jaki sposób mogę usunąć te nagłówki?
Oto mój kod - tylko funkcja raw:
def raw():
HOST = gethostbyname('192.168.1.10')
s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)
s.bind((HOST, 0))
s.setsockopt(IPPROTO_IP, IP_HDRINCL, 0) #no headers - it wont work!!
pckt = packet("\x68\x65\x6c\x6c\x6f")
netpacket = pckt.getpacket()
print "Sending.. "
print ""
s.sendto(netpacket, ('192.168.1.1', 80))
data = s.recv(4096)
print data
o i tutaj jest przechwycony pakiet z hello na końcu:
007f 2809 6da2 28cf daee 2156 0800 4500 004d 1bfc 0000 4000 db59 c0a8 010a c0a8 0101* 007f
2809 6da2 28cf daee 2156 0800 4500 0036 2352 4000 4006 0000 c0a8 010a c0a8 0101 15c0 0050
0000 0000 0000 0000 8010 813b 0000 68656c6c6f -hello
* jest to początek ładunku, mimo że miał to być początek pakietu, nie zamierzam też używać żadnych innych modułów, których muszę użyć w gnieździe.