怎么提高下面代码中socket的发包速率

作者&投稿:纵友 (若有异议请与网页底部的电邮联系)
怎么提高下面代码中socket的发包速率~

#!/usr/bin/python
import socket
from scapy.all import *
import hack_arp
import ip_account
import random
import copy
import ssh_cmd

def udp_send_rcv(local_mac,local_addr,local_port,gw_mac,remote_addr,remote_port,txt,verbose = False) :
eth = Ether(dst=gw_mac,src=local_mac);
ip = IP(dst=remote_addr,src=local_addr);
udp = UDP(sport = local_port , dport = remote_port);
p = eth/ip/udp/txt ;
d = srp1(p,timeout=5);
if verbose == True :
d.show();
return p,d ;
#sendp(p);

def udp_send(sk,pkt):
#sk.sendto(str(pkt),(pkt['IP'].dst,pkt['UDP'].dport));
sk.send(str(pkt));




def main_test(pkt_num=1000,verbose = False,fast_mode=True) :
arp_group = {} ;
ip_header_map = {} ;
for i in range(2,201) :
gw_mac = hack_arp.get_gateway_hw(hack_arp.get_gateway_ip()) ;
ip = "192.168.31."+str(i);
mac = "be:ef:e5:1e:89:"+hex(i)[2:];
eth = Ether(dst=gw_mac);
ip_header = IP(dst = "10.237.100.9",src = ip);
udp_header = UDP(sport = 9000, dport = 9999);
ip_header_map[ip] = copy.deepcopy(eth/ip_header/udp_header) ;

score = {} ;
cmp_txt = 'z'*1500 ;
if fast_mode == True :
try:
#s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW)
s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))
#s = socket.socket(socket.AF_INET, socket.SOCK_RAW)
except socket.error , msg:
print 'Socket could not be created. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()

# tell kernel not to put in headers, since we are providing it
#s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
#s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
s.bind(("eth0",0));
s.setblocking(0);

for i in range(pkt_num) :
index = random.randint(2,200);
local_addr = "192.168.31."+str(index) ;
#txt = str(i)[0] * random.randint(10,1300);
txt = cmp_txt[0:100];
udp_send(s,ip_header_map[local_addr]/txt);
if not score.has_key(local_addr) :
score[local_addr] = (0,0,0,0);
score[local_addr] = (score[local_addr][0]+len(txt)+28,score[local_addr][1]+1,score[local_addr][2]+len(txt)+28+7,score[local_addr][3]+1);
else :
for i in range(pkt_num) :
index = random.randint(2,200);
local_addr = "192.168.31."+str(index) ;
local_port = 9000 ;
local_mac = "be:ef:e5:1e:89:"+hex(index)[2:] ;
gw_mac = "8C:BE:BE:10:05:88" ;
remote_addr = "10.237.100.9" ;
remote_port = 9999 ;
txt = cmp_txt[0:100];
p,d = udp_send_rcv(local_mac,local_addr,local_port,gw_mac,remote_addr,remote_port,str(index)+" send msg "+txt,verbose=verbose);
if not score.has_key(local_addr) :
score[local_addr] = (0,0,0,0);
print score[local_addr]
if verbose == True :
p.show();
d.show();
#score[local_addr] = (score[local_addr][0]+1,score[local_addr][1]+len(p['Raw'].load)+28,score[local_addr][2]+1,score[local_addr][3]+d['IP'].len);
score[local_addr] = (score[local_addr][0]+len(p['Raw'].load)+28,score[local_addr][1]+1,score[local_addr][2]+d['IP'].len,score[local_addr][3]+1);

if verbose == True :
print score ;
res = ip_account.ip_account();
if verbose == True :
print res ;
if_fail = 0 ;
fail_msg = "";
for src in score :
if not res.has_key(src) :
res[src] = (0,0,0,0);
if score[src] == res[src] :
print src + ": matched."
else :
if_fail = 1 ;
fail_msg = fail_msg + src + ": dismatched."+ str(score[src])+":"+ str(res[src]) + ";";
print "error:"
print src + ": dismatched."+ str(score[src])+":"+ str(res[src]);

if if_fail == 1 :
print "failed."

return if_fail,fail_msg

#tcp_link("192.168.31.171",9102,"192.168.31.98",9999);

if __name__=="__main__":
cmd = "" ;
#for i in range(2,201) :
# ip = "192.168.31."+str(i);
# #mac = "be:ef:e5:1e:89:"+hex(i)[2:];
# mac = "f8:b1:56:e3:12:60" ;
# cmd = "arp -s " + ip + " " + mac ;
# ssh_cmd.ssh_cmd("192.168.31.1","xxxxxx",cmd);

fail_table = {} ;
for i in range(1000) :
if_fail,fail_msg = main_test(pkt_num = 100000,verbose=True)
if if_fail == 1 :
fail_table[i] = fail_msg ;
print fail_table ;

linux socket编程我用sendto发包有没有长度限制的
引发非法操作异常的原因有:

应用程序试图对Parent属性为nil的组件进行一些需要窗口句柄的操作.
试图对窗体拖放操作.

引发组件异常的原因有:
Delphi不能注册某个组件

应用程序不能重命名某个组件
资源不足异常被引发是由于当应用程序试图创建窗口句柄而操作系统没有多余的句柄可分配

专用组件异常:许多组件都定义了相应的组件异常类.

#!/usr/bin/python
import socket
from scapy.all import *
import hack_arp
import ip_account
import random
import copy
import ssh_cmd

def udp_send_rcv(local_mac,local_addr,local_port,gw_mac,remote_addr,remote_port,txt,verbose = False) :
eth = Ether(dst=gw_mac,src=local_mac);
ip = IP(dst=remote_addr,src=local_addr);
udp = UDP(sport = local_port , dport = remote_port);
p = eth/ip/udp/txt ;
d = srp1(p,timeout=5);
if verbose == True :
d.show();
return p,d ;
#sendp(p);

def udp_send(sk,pkt):
#sk.sendto(str(pkt),(pkt['IP'].dst,pkt['UDP'].dport));
sk.send(str(pkt));

def main_test(pkt_num=1000,verbose = False,fast_mode=True) :
arp_group = {} ;
ip_header_map = {} ;
for i in range(2,201) :
gw_mac = hack_arp.get_gateway_hw(hack_arp.get_gateway_ip()) ;
ip = "192.168.31."+str(i);
mac = "be:ef:e5:1e:89:"+hex(i)[2:];
eth = Ether(dst=gw_mac);
ip_header = IP(dst = "10.237.100.9",src = ip);
udp_header = UDP(sport = 9000, dport = 9999);
ip_header_map[ip] = copy.deepcopy(eth/ip_header/udp_header) ;

score = {} ;
cmp_txt = 'z'*1500 ;
if fast_mode == True :
try:
#s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW)
s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))
#s = socket.socket(socket.AF_INET, socket.SOCK_RAW)
except socket.error , msg:
print 'Socket could not be created. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()

# tell kernel not to put in headers, since we are providing it
#s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
#s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
s.bind(("eth0",0));
s.setblocking(0);

for i in range(pkt_num) :
index = random.randint(2,200);
local_addr = "192.168.31."+str(index) ;
#txt = str(i)[0] * random.randint(10,1300);
txt = cmp_txt[0:100];
udp_send(s,ip_header_map[local_addr]/txt);
if not score.has_key(local_addr) :
score[local_addr] = (0,0,0,0);
score[local_addr] = (score[local_addr][0]+len(txt)+28,score[local_addr][1]+1,score[local_addr][2]+len(txt)+28+7,score[local_addr][3]+1);
else :
for i in range(pkt_num) :
index = random.randint(2,200);
local_addr = "192.168.31."+str(index) ;
local_port = 9000 ;
local_mac = "be:ef:e5:1e:89:"+hex(index)[2:] ;
gw_mac = "8C:BE:BE:10:05:88" ;
remote_addr = "10.237.100.9" ;
remote_port = 9999 ;
txt = cmp_txt[0:100];
p,d = udp_send_rcv(local_mac,local_addr,local_port,gw_mac,remote_addr,remote_port,str(index)+" send msg "+txt,verbose=verbose);
if not score.has_key(local_addr) :
score[local_addr] = (0,0,0,0);
print score[local_addr]
if verbose == True :
p.show();
d.show();
#score[local_addr] = (score[local_addr][0]+1,score[local_addr][1]+len(p['Raw'].load)+28,score[local_addr][2]+1,score[local_addr][3]+d['IP'].len);
score[local_addr] = (score[local_addr][0]+len(p['Raw'].load)+28,score[local_addr][1]+1,score[local_addr][2]+d['IP'].len,score[local_addr][3]+1);

if verbose == True :
print score ;
res = ip_account.ip_account();
if verbose == True :
print res ;
if_fail = 0 ;
fail_msg = "";
for src in score :
if not res.has_key(src) :
res[src] = (0,0,0,0);
if score[src] == res[src] :
print src + ": matched."
else :
if_fail = 1 ;
fail_msg = fail_msg + src + ": dismatched."+ str(score[src])+":"+ str(res[src]) + ";";
print "error:"
print src + ": dismatched."+ str(score[src])+":"+ str(res[src]);

if if_fail == 1 :
print "failed."

return if_fail,fail_msg

#tcp_link("192.168.31.171",9102,"192.168.31.98",9999);

if __name__=="__main__":
cmd = "" ;
#for i in range(2,201) :
# ip = "192.168.31."+str(i);
# #mac = "be:ef:e5:1e:89:"+hex(i)[2:];
# mac = "f8:b1:56:e3:12:60" ;
# cmd = "arp -s " + ip + " " + mac ;
# ssh_cmd.ssh_cmd("192.168.31.1","xxxxxx",cmd);

fail_table = {} ;
for i in range(1000) :
if_fail,fail_msg = main_test(pkt_num = 100000,verbose=True)
if if_fail == 1 :
fail_table[i] = fail_msg ;
print fail_table ;


python中s*=2与s=s*2有什么区别?
s = s * 2 会创建一个新的对象,将原来的 s 的值乘以 2,然后再将结果赋值给 s,这个过程中需要创建一个新的对象。如果 s 是一个较大的对象,那么这个操作就会比较耗时和消耗内存。因此,如果你想要就地修改一个对象的值,可以使用就地修改运算符 *=、+=、-= 等,以提高代码的效率和性能。

这段代码中s.ch[i]代表什么?为什么不是string.ch[i]?
string是个共同体,s类似共同体的一个对象。所以s.ch[i]就是这个对象中的成员。一般共同体是个形式类,而我们真正操作的是他的对象,呵呵。所以要写成s.ch[i]啊。

s idx是什么意思?
s idx在程序开发中也具有实际意义。程序员可以使用s idx来实现各种编程任务,例如截取字符串、复制数组和替换元素等。使用s idx可以让程序员更加灵活和高效地开发程序,从而提高代码质量和可维护性。综上所述,s idx在计算机编程中具有重要的意义,它不仅是数据结构和算法的重要组成部分,也是程序开发中不...

正则匹配中,\\ d\\ s\\ w的作用是什么?
1、【\\d】表示可以匹配任意一个数字,相当于【[0-9]】。2、从下面的代码例子中可以看到:【\\s】表示可以匹配任意一个空白字符,就比如说:换页符、换行符、回车和制表符等。3、从下面的代码例子中可以看到:【\\w】表示可以匹配任意一个数字、字母(包括大小写)和下划线。4、【.】表示可以匹配除...

下面代码中的this=&a;和s=&a;感觉是一样的意思,为什么一个报错,一...
this的确不能做左值,就是说,this是不能修改的(难道你要他自己“干掉”自己?这做不到啊!)正确的copy方式是:void Cone::copy(Cone &a){if(this==&a)return;this->x=a->x;this->y=a->y;} 下面的 s=&a;s 的确就是可以修改的左值,就是个变量嘛,可以修改。区别在于this不可修改...

java中"s="+s什么意思 下面一题(40)解答过程是啥
"s="+s:表示字段"s="与变量s相加。40题解答:测试类执行main方法。首先定义了int类型变量i,s并赋值为0.定义了循环体,使用变量i赋初值为1,循环会判断i是否小于100,小于100则执行循环体的代码,执行一遍后i会自增加1然后在判断是否小于100,小则进入循环否则执行循环体外的代码。循环体内:s+=i...

c中scanf(“%*s”)有什么用啊
s 带星号的都是跳过输入。以%s方式读入一个字符串,但是不赋值给任何变量。等效于 你创建一个足够大的字符数组s[1000];然后 scanf("%s",s);之后s的值不使用。s简化了这个过程 提高效率。

数控铣床的M\/S\/T代码分别是什么?
M辅助功能代码 S转速 T刀具代码 零位机床参考点或你的程序原点 刀补偿 长度和半径补偿 螺补这个不经常用的 进给倍率,数率 你设的值与它相乘就是你用的实际值 偏置量见补偿里面的,偏移量和偏置量大致一样,矢量,旧矢量,新矢量就是带有方向的距离了 ...

stm32敲代码下面显示的快捷叫什么?
1. Ctrl+C 和 Ctrl+V:分别用于复制和粘贴文本。2. Ctrl+Z 和 Ctrl+Y:分别用于撤销和重做上一次操作。3. Ctrl+F:用于查找指定的字符串。4. Ctrl+G:用于跳转到指定的行数。5. Ctrl+S:用于保存当前文件。6. F5:用于编译并下载代码到目标设备。以上这些快捷键都可以帮助开发者提高编程效率...

专利中尾部字母“A”、“U”“S”各代表什么
A、U、S为专利文献种类代码,其中,A代表发明专利公开(发明专利授权是B),U代表实用新型授权,S代表外观设计授权。专利(patent),从字面上是指专有的权利和利益。“专利”一词来源于拉丁语Litterae patentes,意为公开的信件或公共文献,是中世纪的君主用来颁布某种特权的证明,后来指英国国王亲自签署...

涟源市18051129060: Socket发送问题 -
童矩归脾: 把类型名字放在最前面并存入流中(用BinaryWriter的write方法写到流里)再将此类型变量按序...

涟源市18051129060: 如何提高socket通信的速度
童矩归脾: 别感觉,要有具体的测试数据才好解决.比如网络连通情况、丢包率、TCP是否拆包、应用数据是否存在压缩解压处理.

涟源市18051129060: Socket发送问题
童矩归脾: 把类型名字放在最前面并存入流中(用BinaryWriter的write方法写到流里)再将此类型变量按序存入流中,并取出字节流发送.这样服务器只需将字节数组存到内存流里,并用BinaryReader的ReadString方法把名字读出来,用名字反射一个对象...

涟源市18051129060: 请教高手们一个如何提高java线程并发性的问题 -
童矩归脾: 建议你使用asyncExec方法 Socket使用Non-block Socket(NIO)非阻塞试的连接.SWT组件Diaplay提供syncExec与asyncExec方法,其原型为:syncExec (Runnable runnable),asyncExec (Runnable runnable),Runnable的run方法中可以封装要执行...

涟源市18051129060: java中的socket通信,怎么发送一个byte[]数组? -
童矩归脾: socket发送的是流,所以必须将byte[]转换成流的形式,之后才可以发送的.创建socket后可以通过下面的方法实现发送:PrintWriter pw = null; pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter( socket.getOutputStream()))); //创建一个输入流,之后这个流的指向是socket pw.write(request.toString()); //写入要输入的Byte[],转换为字符串,之后进行传送 pw.close();//传送完毕,关闭流

涟源市18051129060: 大牛,怎么提高WINDOWS 下用socket 发送 UDP包的速度 -
童矩归脾: 最好的socket编程方式是在头部前4个字节放整个数据长度,再4个字节消息类型,4个字节列号,==再内容.即是消息头部长度固定,内容部分可变.如果每次发送数据大小超过单次发送量,数据会被分包发送.在接收端还要做组包处理.组包也是根据数据长度去组包.这些是2年电信大数据开发得出的实际经验.

涟源市18051129060: C++的socket方法 -
童矩归脾: C++中Socket方法主要用于网络通信,常用到的函数如下: CSocket::Socket初始化 CSocket::SetSockOpt 设置socket选项 CSocket::Bind 绑定地址端口 CSocket::Connect 连接 CSocket::Listen 监听 CSocket::Accept 接收外部连接的socket ...

涟源市18051129060: java编程中,Socket通信是怎么实现的? -
童矩归脾: java编程对于Socket之间的通信过程如下:服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容.Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的...

涟源市18051129060: 死循环socket发送消息,如何提高性能 -
童矩归脾: 你用的阻塞还是非阻塞socket? 异步发送还是同步发送?如果按照IO速率考察的话,网络是慢速设备,所以正常的情况下一开始快是因为缓冲区未满,之后缓冲区负荷增加造成发送时间增加.

涟源市18051129060: python socket发送字符串问题 -
童矩归脾: python3中binary string 和 string不能合在一起 s.send("%s\r\n" %data)

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网