python使用原始套接字發(fā)送二層包(鏈路層幀)的方法
發(fā)送端代碼:
#!/usr/bin/python # -*- coding: UTF-8 -*- import socket import struct raw_socket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x1234)) raw_socket.bind(("eth0", 0)) packet = struct.pack("!6s6sH", "\xff\xff\xff\xff\xff\xff", "\xaa\xaa\xaa\xaa\xaa\xaa", 0x1234) while True: print repr(packet) raw_socket.send(packet + "hello,world!")
1.創(chuàng)建套接字使用地址家族PF_PACKET,類型為SOCK_RAW,自定義類型為0x1234,這個和C語言一模一樣。自定義類型我們也可以使用0X0800,這個是ETH_P_IP,相當(dāng)于我們模擬ip包來發(fā)送,那么ip包頭和mac包頭都需要我們自己填寫?,F(xiàn)在我們使用0x1234,系統(tǒng)定義之外的協(xié)議類型。
2.由于是發(fā)送二層包,我們默認(rèn)網(wǎng)卡沒有配置網(wǎng)絡(luò),也就是ping不通的情況下,直接綁定網(wǎng)卡上。
3.linux內(nèi)核中定義的mac包頭結(jié)構(gòu)
struct ethhdr { unsigned char h_dest[6]; unsigned char h_source[6]; uint16_t h_proto; //0x1234 };
第一個是目的mac地址,第二個是本機(jī)mac地址,第三個是自定義類型必須填寫,這樣對方也關(guān)心這個自定義類型時,協(xié)議棧收到二層包才能正確給到對方的套接字。通過這個結(jié)構(gòu)體,所以使用了pack,”!6s6sH”。我這里使用的廣播地址發(fā)送。
接收端代碼:
#!/usr/bin/python # -*- coding: UTF-8 -*- import socket import struct raw_socket = socket.socket(socket.PF_PACKET,socket.SOCK_RAW,socket.htons(0x1234)) while True : packet = raw_socket.recv(1024) data = struct.unpack("!6s6sH12s", packet) print repr(data[0]) print repr(data[1]) print repr(data[2]) print repr(data[3])
以上這篇python使用原始套接字發(fā)送二層包(鏈路層幀)的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文搞懂Python中的進(jìn)程,線程和協(xié)程
并發(fā)編程是實現(xiàn)多任務(wù)協(xié)同處理,改善系統(tǒng)性能的方式。Python中實現(xiàn)并發(fā)編程主要依靠進(jìn)程、線程和協(xié)程,本文將通過示例詳解三者的區(qū)別,感興趣的可以了解一下2022-05-05python 列表轉(zhuǎn)為字典的兩個小方法(小結(jié))
這篇文章主要介紹了python 列表轉(zhuǎn)為字典的兩個小方法(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Python腳本開發(fā)中的命令行參數(shù)及傳參示例詳解
這篇文章主要為大家介紹了Python腳本開發(fā)中的命令行參數(shù)及傳參示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07快速解釋如何使用pandas的inplace參數(shù)的使用
這篇文章主要介紹了快速解釋如何使用pandas的inplace參數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07