关于Python的RAW socket编程

关于Python的RAW socket编程

我想发携带IP包的以太网帧。
linux下面的基本代码如下
import socket
import array

s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, 0x0800) # 以太网帧头的Protocol字段为0x0800表示携带的是IP包
s.bind(('eth0', 50007)) #绑定到eth0网口,使用50007端口,这里有问题不明,看下面的问题列表1
data = ['00', '11', '22', '33', '44', '55'] #目标MAC地址
data += ['66', '77', '88', '99', 'AA', 'BB'] #源MAC地址
data += ['08', '00'] #MAC帧头的Protocol字段
data += ['45', '00', '00', '6E', '00', '00', '00', '00', '04', '06', '99', 'A7', '0A', '00', '04', '1B', '0A', '00', '04', 'C9'] #标准IP包的包头,应该看得懂吧^_^
data += ['AA' for i in xrange(90)] # 90字节的payload
data += ['18', '2E', '93', 'CF'] # 以太网帧尾的CRC32的FCS,不过这个字段好像socket这层是不处理的。目标端用sniffer捕获的时候也看不到这FCS,所以我没发送。具体件问题列表2
rawdata = array.array('B', [int(i, 16) for i in data[:-4]] #转化成要发松的数据,注意最后4字节的FCS没有发送
s.send(rawdata.tostring())
... # 再多发几个,或者干点其他什么事
s.close() # 关掉socket


我的问题:

  • bind函数:我看了Python的文档,说是这个函数的参数是socket address,但是没有提到可以使用'eth0'网卡接口作为地址参数的。因为这种用法我是网上找来的,所以不明白为什么这样用,哪位大虾明白的请告知。
  • 关于RAW socket 的FCS字段:为什么以太网帧的最后4一个字节的FCS不需要发送,这个是不是有网卡在物理层处理了(物理层在发送是自动添加,接受时自动校验剥离)?
  • 同样的代码在windows下没法运行,需要修改,我知道需要修改的内容有:socket.AF_PACKET在Windows下没有定义,不知道用什么替代;肯定不能bind到eht0了,windows下不知道要bind到何地址。有谁知道如何在Windows下使用Python发送携带IP包的以太网帧?
  • 我的代码可有人和不妥之处?欢迎指正

谢谢。

晕,居然没人回应

经过几天奋斗,下终于实现了发送原始以太网帧(要用以下驱动,然后写一个Python的C模块调用驱动就好了)
其他的也不是大问题,多少有点明白了。
你的发送数据需要用pack打包,不是你那样字符累加进去的。另外raw建议使用现成的扩展库。
python自己不带raw.