构造icmp包python-socket-收包解包

socket收包,如前面的文章实现了python socket发ping包,并且收到了对端的返回结果,那么如何把返回的包也用socket收上来呢?疑问,socket建立了一个管道,管道建好以后可以通过管道把包发出去,怎么保证收到的包也可以从管道上来呢?答案:socket只要建立好之后,就有发包和收包两种方法。直接使用 socket.recv方法就可以。但是 recv方法一次只能收一个包,和sendto方法一次只能发送一个包的道理类似。收上来的包如果不做类型转化默认为 str类型,需要转化为bytearray类型,才能通过ICMP协议规定的组织结构,通过字节偏移取出各个字段。

另外:如果要写连续ping 多个不同的ip地址,并且收包完成的话,需要设计总的超时时间。这个在下一节中在实现。

recv,解包代码如下:

源码如下:


#!/bin/env/python

import socket

import struct

import os

import time

_ICMP_HDR_OFFSET =20

_ICMP_ECHO_REPLY =0

_ICMP_ID_OFFSET = _ICMP_HDR_OFFSET +4

_ICMP_IDENT_OFFSET = _ICMP_HDR_OFFSET +6

_ICMP_PAYLOAD_OFFSET = _ICMP_HDR_OFFSET +8

# create icmp socket

def create_socket():

proto ='ICMP'

    try:

icmp_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)

print icmp_socket

except Exception as e:

raise e

return icmp_socket

def checksum(source_string):

"""

I'm not too confident that this is right but testing seems

to suggest that it gives the same answers as in_cksum in ping.c

"""

    sum =0

    countTo = (len(source_string)/2)*2

    count =0

    while count

thisVal =ord(source_string[count +1])*256 +ord(source_string[count])

sum = sum + thisVal

sum = sum &0xffffffff # Necessary?

        count = count +2

    if countTo

sum = sum +ord(source_string[len(source_string) -1])

sum = sum &0xffffffff # Necessary?

    sum = (sum >>16)  +  (sum &0xffff)

sum = sum + (sum >>16)

answer = ~sum

answer = answer &0xffff

    # Swap bytes. Bugger me if I know why.

    answer = answer >>8 | (answer <<8 &0xff00)

return answer

# generate icmp data

def generate_pkg():

## ICMP pkg header

  pkt_id = os.getpid()

ident =0

  pkg_header_pre = struct.pack("!BBHHH",8,0,0, pkt_id, ident)

payload = struct.pack("d", time.time())

pkgheader_check = checksum(pkg_header_pre+payload)

pkg_header = struct.pack("!BBHHH",8,0, pkgheader_check, pkt_id, ident)

pkg = pkg_header+payload

return pkg

def send_pkg(icmp_socket,pkt,dst_addr):

icmp_socket.sendto(pkt,dst_addr)

def recrive_pkg(icmp_socket):

pkts = []

icmp_socket.settimeout(100)

p = icmp_socket.recv(64)

print type(p)

pkt =bytearray(p)

print type(pkt)

pkts.append((bytearray(pkt), time.time()))

print pkts

print pkt[_ICMP_HDR_OFFSET]

pkt_id = (pkt[_ICMP_ID_OFFSET] <<8) + pkt[_ICMP_ID_OFFSET +1]

pkt_ident = (pkt[_ICMP_IDENT_OFFSET] <<8) + pkt[_ICMP_IDENT_OFFSET +1]

payload = pkt[_ICMP_PAYLOAD_OFFSET :]

print pkt_id

print pkt_ident

print payload

if __name__ =='__main__':

icmp_socket = create_socket()

pkt = generate_pkg()

dst_addr ='61.135.169.121'

    real_dst_addr = (dst_addr,0)

send_pkg(icmp_socket, pkt, real_dst_addr)

recrive_pkg(icmp_socket)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350