ホームページ > バックエンド開発 > Python チュートリアル > Python 基本チュートリアル: ローカル IP データ パケットの取得の例

Python 基本チュートリアル: ローカル IP データ パケットの取得の例

WBOY
リリース: 2016-06-16 08:45:21
オリジナル
1291 人が閲覧しました

ここ数日間、生のソケットを使用し、Python でいくつかのデモ プログラムを作成しました。これをここに記録します。

まず、単純なスニファー プログラムを見てみましょう。

コードをコピーします コードは次のとおりです:

# /usr/bin/python
# コードlinux
インポートソケット
#s =ソケット.ソケット(ソケット.AF_INET,ソケット.SOCK_RAW,ソケット.IPPROTO_UDP)
s =ソケット.ソケット(ソケット.AF_INET,ソケット.SOCK_RAW,ソケット.IPPROTO_TCP)
while True :
print s.recvfrom(65535)

ここでは、生のソケットを直接使用してデータを受信し、直接印刷します。これはほんの数行のコードなので、説明する必要はありません。理解できない場合は、Google で調べてください。

IP データ パケットを取得したら、次のステップは IP ヘッダーを解析することです。その前に、RFC (RFC791: http://www.ietf.org/rfc/) で IP ヘッダーがどのように定義されているかを見てみましょう。 rfc791 .txt ):

Python 基本チュートリアル: ローカル IP データ パケットの取得の例

は、対応する画像です:

Python 基本チュートリアル: ローカル IP データ パケットの取得の例

RFC と上の図から、IP パケット ヘッダーの各フィールドが占める桁数がわかります。これらの定義に基づいて IP パケット ヘッダーを解析し、対応するポリシーに従ってデータを処理できます。 。
これは、Python で実装された IP ヘッダーを解析するコードです (笑、これはデモのコードです。最初の 20 バイトのみが解析されます):

コードをコピー コードは次のとおりです:

def decodeIpHeader(packet):
mapRet = {}
mapRet[ "version"] = (int(ord(packet[0])) & 0xF0)>>4
mapRet["headerLen"] = (int(ord(packet[0])) & 0x0F )< <2
mapRet["serviceType"] = hex(int(ord(packet[1])))
mapRet["totalLen"] = (int(ord(packet[2])< ;< 8))+(int(ord(packet[3])))
mapRet["identification"] = (int( ord(packet[4])>>8 )) + (int( ord(packet [5])))
mapRet["id"] = int(ord(packet[6]) & 0xE0)>>5
mapRet["fragOff"] = int(ord( packet[6] ]) & 0x1F) < = int(ord(packet[9]))
mapRet["checkSum"] = int(ord(packet[10])< mapRet["srcaddr"] = "%d.%d.%d.%d" % (int(ord(packet[12])),int(ord(packet[ 13])),int(ord(packet[14])), int(ord(packet[15])))
mapRet["dstaddr"] = "%d.%d.%d.%d" % (int(ord(packet[16]) ), int (order (packet [17])), int (ord (packet [18])), int (order (order [19])))
戻り値マプレット


発信者コード:

コードをコピー コードは次のとおりです:proto =ソケット.getprotobyname('tcp') # tcp のみ
sock = ソケット.ソケット(ソケット.AF_INET, ソケット.SOCK_RAW, プロト)

while True: packet = sock.recvfrom(65535)[0]

if len(packet) == 0:
sck.close()
else:
#print str(packet)
mapIpTmp = decodeIpHeader(packet)
for k,v in mapIpTmp.items():
print k,"t:t",v

print ""


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート