def send_msg(kwargs): if type(kwargs) is not types.DictType: #这个格式判断可以学习一下。虽然在这个程序里没什么用。 return #源ip地址,如果字典里没添,就获取真实地址 src_ip=inet_aton(kwargs.get('src', socket.gethostbyname(socket.gethostname()))) #目的ip地址 dst_ip=inet_aton(kwargs.get('dst')) #源mac地址,如果字典里没添,就获取真实mac地址 src_mac=pack_mac(kwargs.get('src_mac',get_local_mac())) #目的mac地址 dst_mac=pack_mac(kwargs.get('dst_mac')) host=kwargs.get('host',socket.gethostname()) user=kwargs.get('user') msg=kwargs.get('msg') #288表示发送信息 #msg="1_lbt2_2#0#002564CA9C71#0#0#0:%s:%s:%s:288:%s" %(int(strftime('%m%d%H%M%S'))+100000000, user, host, msg) #应用层的数据 msg="1_lbt2_2#0#002564CA9C71#0#0#0:%s:%s:%s:209:%s" %(int(strftime('%m%d%H%M%S'))+100000000, user, host, msg) #应用层的数据 msg=msg.decode('utf-8').encode("gb2312") udp=dpkt.udp.UDP(dport=2425, sport=2425) udp.data+=msg #传输层的数据 udp.ulen=len(udp) ip = dpkt.ip.IP(src=src_ip, dst=dst_ip, data=udp, p=dpkt.ip.IP_PROTO_UDP) #网络层的数据 ip.len=len(ip) #重新计算ip的长度,不然消息发送不出去 ether = dpkt.ethernet.Ethernet( #数据链路层的以太网帧 dst = dst_mac, src = src_mac, type = 0x0800, data = ip ) device=sendpkt.findalldevs()[0] sendpkt.sendpacket(str(ether), device) # 直接利用网卡。整个数据帧都是我构造的。
def send_msg(kwargs): local_ip=inet_aton(kwargs['src']) remote_ip=inet_aton(kwargs['dst']) local_mac=pack_mac(kwargs['src_mac']) #判断remote_ip和local_ip是否在同一个网段 remote_mac=pack_mac(kwargs['dst_mac'])\ if trans(kwargs['src'])==trans(kwargs['dst']) else pack_mac(MASK_MAC) host=kwargs['host'] user=kwargs['user'] msg=kwargs['msg'] device=sendpkt.findalldevs()[0] #飞鸽监听本地的UDP 2425端口 udp=dpkt.udp.UDP(dport=2425,sport=2425) #向飞鸽发送消息命令字 #6291458表示下线 #6291457表示上线 #288表示发送信息 msg="1_lbt4_10#65664#%s#0#0#0:%s:%s:%s:288:%s" \ %(kwargs['src_mac'].replace('-',''),int(strftime('%m%d%H%M%S'))+1000000000,user,host,msg) msg=msg.encode("gbk") udp.data+=msg udp.ulen=len(udp) ip=dpkt.ip.IP(src=local_ip,dst=remote_ip,data=udp,p=dpkt.ip.IP_PROTO_UDP) #重新计算ip的长度,不然消息发送不出去 ip.len=len(ip) ether=dpkt.ethernet.Ethernet( dst=remote_mac, src=local_mac, type=0x0800, data=ip ) sendpkt.sendpacket(str(ether),device)
def test_sendpacket_typeerror(self): """尝试其他类型的参数以产生类型异常""" try: sendpkt.sendpacket(25) except TypeError, e: pass
def test_call_sendpacket_keyword(self): """尝试以关键字方式传递包""" sendpkt.sendpacket(packet=self.packet, device=self.device) return
def test_call_sendpacket(self): """尝试调用一下sendpacket函数""" sendpkt.sendpacket(self.packet, self.device) return
while self.looping: tm, pkt = self.pc.next() pkt = str(pkt) if self.filterpacket(pkt): self.pktqueue.put(pkt) return def filterpacket(self, pkt): return True def stop(self): self.looping = False return sendpacket = lambda pkt: sendpkt.sendpacket(pkt, settings.ETHIF) ############################################################################### import unittest import Queue import time class TestCapThread(unittest.TestCase): def setUp(self): return def tearDown(self): return def testall_1(self):
def run(self): while self.looping: tm,pkt=self.pc.next() pkt=str(pkt) if self.filterpacket(pkt): self.pktqueue.put(pkt) return def filterpacket(self,pkt): return True def stop(self): self.looping=False return sendpacket=lambda pkt:sendpkt.sendpacket(pkt,settings.ETHIF) ############################################################################### import unittest import Queue import time class TestCapThread(unittest.TestCase): def setUp(self): return def tearDown(self): return def testall_1(self):