日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python使用原始套接字發送二層包(鏈路層幀)的方法

系統 1676 0

發送端代碼:

            
#!/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.創建套接字使用地址家族PF_PACKET,類型為SOCK_RAW,自定義類型為0x1234,這個和C語言一模一樣。自定義類型我們也可以使用0X0800,這個是ETH_P_IP,相當于我們模擬ip包來發送,那么ip包頭和mac包頭都需要我們自己填寫。現在我們使用0x1234,系統定義之外的協議類型。

2.由于是發送二層包,我們默認網卡沒有配置網絡,也就是ping不通的情況下,直接綁定網卡上。

3.linux內核中定義的mac包頭結構

            
struct ethhdr
{
 unsigned char h_dest[6];
 unsigned char h_source[6];
 uint16_t h_proto; //0x1234
};

          

第一個是目的mac地址,第二個是本機mac地址,第三個是自定義類型必須填寫,這樣對方也關心這個自定義類型時,協議棧收到二層包才能正確給到對方的套接字。通過這個結構體,所以使用了pack,”!6s6sH”。我這里使用的廣播地址發送。
接收端代碼:

            
#!/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使用原始套接字發送二層包(鏈路層幀)的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 鹤山市| 岐山县| 台安县| 抚松县| 陆良县| 武城县| 九龙城区| 治县。| 南城县| 韶关市| 井冈山市| 葫芦岛市| 新巴尔虎左旗| 铅山县| 平昌县| 安陆市| 四平市| 兖州市| 定陶县| 金秀| 芦溪县| 乌拉特前旗| 吉林省| 遂川县| 禹城市| 壤塘县| 习水县| 前郭尔| 修水县| 闵行区| 临沂市| 鹰潭市| 岢岚县| 安徽省| 古田县| 南陵县| 榆林市| 乐都县| 青川县| 汉川市| 吐鲁番市|