- 浏览: 271543 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
f002489:
我用Python爬了4400条淘宝商品数据,竟发现了这些“潜规 ...
爬取千万淘宝商品的python脚本 -
f002489:
java职业分析与技能图谱
java职业发展所应具有的技能。 学习路线图 -
f002489:
C#调用C++类库的几种方式C#委托实现C++ Dll中的回调 ...
C#中直接操作内存的方法 -
f002489:
如何测量C#代码的运行时间 :(1)用Datatime和Tme ...
C#中直接操作内存的方法 -
f002489:
使用c语言调用python小结
Python与C/C++相互调用
http://www.cnblogs.com/yushih/archive/2010/06/01/1749378.html
首先声明:本人只是试验成功,还没有进行过严格正确性、性能和稳定性的实验。以下程序可能存在bug。使用者自己注意。
问题
:有人在豆瓣Python版提出“在一台PC上模拟多个IP地址向服务器发起socket连接,并在建立连接后发数据包“的需求。具体要求是“可以在
界面上输入想要模拟的IP地址的范围,比如我想模拟100个用户,就输入192.168.4.100——192.168.4.200,然后自动以这些IP
地址向服务器发socket连接和一些数据“,“服务器侧是一个注册系统,以IP和序列号区分不同用户,我要想进行压力测试必须模拟不同的IP地址“。环
境是“测试所有使用的都是私网地址,而且环境比较独立,所以不必考虑NAT和IP冲突问题“。限制:”服务器侧要是能动就好了,就是不能改动“。以下是我
的解决方法。
搭建环境
:服务器端环境不限。客户端必须是Linux。服务器和客户直接通过LAN连接。以上只是逻辑要求,可以用虚拟机在一台电脑上实现。客户端ip地
址设置为cip,掩码nm,服务器端ip地址设置为sip(sip&nm ==
cip&nm),掩码nm,缺省网关cip(注意,是把服务器的缺省网关地址设置为客户ip地址。课后练习:为什么?)。
软件安装
:在客户端装nfqueue-bindings(http://software.inl.fr/trac/wiki/nfqueue-
bindings)。有大量的依赖需要安装,不过不需要Perl,只要把CMakeLists.txt中“ADD_SUBDIRECTORY(perl)
“这一行去掉。另外libnetfilter-queue要自己下载编译安装,至少在我的机器上用rpm安装后nfqueue-bindings不认。
运行ip模拟器
:在客户端以root权限运行wansim.py(代码在后面),命令行参数为:
python wansim.py sip cip ip_range
其中sip为上面设置的服务器ip,cip为上面设置的客户端机器ip,ip_range为要模拟的ip范围,例如:
1.1.1.1-254
1.1.1-254.1-254
222-235.1-8.2.3-6
限制:模拟ip不能进入客户端-服务器所用LAN的子网ip范围,即对任何模拟ip地址fip:fip&nm != sip&nm(课后作业:为什么?)。
ip模拟器开始运行后,所有从客户端发起到服务器端的tcp会话将被ip模拟器从指定ip范围中随机分配一个ip。服务器程序看到的是这个模拟的ip,而不是cip。
运行:运行服务器。在客户机上运行客户端测试软件。以下是我Windows上服务器看到的效果:
很明显服务器看到的是模拟出来的客户ip。
最后,上代码,再次声明,本人不负任何责任。以下代码进入公共域。
sys.path.append(r ' /usr/local/lib/python2.6/site-packages ' )
import nfqueue
import time
from socket import AF_INET, AF_INET6, inet_ntoa, inet_aton
from dpkt import ip, tcp, hexdump
import re
import sys
import random
svr_ip = sys.argv[ 1 ]
my_ip = sys.argv[ 2 ]
def parse():
for r in sys.argv[ 3 ].split( ' . ' ):
if ' - ' in r: # xxx-yyy
m = re.match(r ' (\d+)-(\d+) ' , r)
yield range(int(m.group( 1 )), int(m.group( 2 )) + 1 )
else : # xxx
yield range(int(r), int(r) + 1 )
fake_ip_range = list(parse())
def get_fake_ip():
ip = ' . ' .join(str(random.choice(r)) for r in fake_ip_range)
print ' fake ip: ' , ip
return ip
# Track connection by src port. This is very crude. Should watch tcp more closely.
port2ip = {}
time0 = None
def cb(i,payload):
global time0
data = payload.get_data()
pkt = ip.IP(data)
if not time0:
time0 = time.time()
print time.time() - time0,\
" source: %s " % inet_ntoa(pkt.src),\
" dest: %s " % inet_ntoa(pkt.dst)
if pkt.p == ip.IP_PROTO_TCP:
# outgoing to target server
if inet_ntoa(pkt.dst) == svr_ip:
if pkt.tcp.sport in port2ip:
pkt.src = port2ip[pkt.tcp.sport]
else :
fip = inet_aton(get_fake_ip())
port2ip[pkt.tcp.sport] = fip
pkt.src = fip
# incoming from target server
elif inet_ntoa(pkt.src) == svr_ip and \
inet_ntoa(pkt.dst) != my_ip:
# a stronger condition is to check if it is one of our fake ip
pkt.dst = inet_aton(my_ip)
pkt.tcp.sum = 0
pkt.sum = 0
payload.set_verdict_modified(
nfqueue.NF_ACCEPT,str(pkt),len(pkt))
return 0
payload.set_verdict(nfqueue.NF_ACCEPT)
sys.stdout.flush()
return 1
def run(cmd):
from commands import getstatusoutput
(s, o) = getstatusoutput(cmd)
print cmd
print ' exit code ' , s
if len(o):
print o
cmds = [
# intercept outgoing packets
" iptables -t mangle -A POSTROUTING -p tcp -d %s -j NFQUEUE " % svr_ip,
# intercept incoming packets
" iptables -t mangle -A PREROUTING -p tcp -s %s -j NFQUEUE " % svr_ip,
# "iptables -A INPUT -p tcp -i eth1 -j NFQUEUE "
]
for c in cmds:
run(c)
q = nfqueue.queue()
print " open "
q.open()
print " bind "
q.bind(AF_INET);
print " setting callback "
q.set_callback(cb)
print " creating queue "
q.create_queue(0)
print " trying to run "
try :
q.try_run()
except KeyboardInterrupt, e:
print " interrupted "
print " unbind "
q.unbind(AF_INET)
print " close "
q.close()
for c in cmds:
run(c.replace( ' -A ' , ' -D ' ))
如果需要更改模拟ip分配的方式,只需修改get_fake_ip这个函数。
发表评论
-
爬取千万淘宝商品的python脚本
2018-03-26 12:09 874importtime import leveldb fro ... -
Python与C/C++相互调用
2017-10-23 11:45 796Python实例浅谈之三Python与C/C++相互调用 -
教你阅读Python开源项目代码
2017-02-24 16:28 888教你阅读Python开源项目代码 https://zhuanl ... -
python执行shell命令的四种方法
2016-12-28 22:36 1036#!/usr/bin/env python # -* ... -
Python 多进程应用示例
2016-12-06 00:01 506python中threading模块详解(一) http:/ ... -
Python多线程应用示例
2016-12-06 00:02 639import threading commonlist=r ... -
Python 字符串操作方法大全
2016-12-05 23:11 413http://www.jb51.net/article/479 ... -
python字符串连接的N种方式总结
2016-12-05 23:05 602python中有很多字符串连接方式,今天在写代码,顺便总结一下 ... -
Python常见格式化字符串方法小结【百分号与format方法】
2016-12-05 23:05 1368【方式一】百分号(%)方式,类C的printf,需要分别不 ... -
python 遍历文件夹 目录 文件
2016-12-03 17:26 1045http://www.cnblogs.com/kaituore ... -
人民币小写转大写程序,支持到万亿
2011-04-26 14:45 1693# -*- coding: gbk -*- #-------- ... -
用python正则表达式提取网页的url
2011-04-22 10:40 1593http://edu.codepub.com/2010/042 ... -
python中的三个读read(),readline()和readlines()
2011-04-21 18:07 17518我们谈到“文本处理”时,我们通常是指处理的内容。Pytho ... -
Python运算符重载__类常用的内置方法
2011-04-18 10:06 2423http://xukaizijian.blog.1 ... -
python对文件及文件夹的一些操作
2011-04-13 15:46 1805http://www.cnblogs.com/phoebus0 ... -
使用xlrd模块时对Excel
2011-04-13 15:44 0import xlrd def getExcelData(f ... -
Python异常处理
2011-04-13 15:34 1753http://www.cnblogs.com/phoebus0 ... -
使用xlrd模块时对Excel的日期处理
2011-04-02 11:54 2891http://blog.donews.com/limodou/ ... -
一个Python程序员的进化
2011-03-28 22:46 954http://developer.51cto.com/art/ ... -
年度黑马Python 自省指南(1)
2011-03-28 22:44 1301http://developer.51cto.com/art/ ...
相关推荐
在这个特定的场景中,我们讨论的是一个设计为连接多个服务器的Socket客户端。这个客户端程序能够向多个服务端发送消息,并且在消息中携带自身的ID,以便服务端识别消息来源。此外,它还具备了自动重连功能,即在非...
在客户端唯一需要知道的就是它归属的调度服务器的通信IP和端口,因此client是发送连接的主动方,由调度服务器监听是否有client请求建立连接,当建立连接成功后,把该连接信息存储到一个结合中以便监控client的存货...
在标题"socket 一个服务器对应多个客户端使用多线程"中,提到的是使用Socket编程来设计一个服务器,该服务器能够同时处理来自多个客户端的连接请求,这通常被称为“一对一”或“一对多”模型。在Linux环境下,这种...
在短连接中,每个请求-响应对都建立一个新的Socket连接,处理完后立即关闭。这种模式的优点是资源利用率高,避免了长时间占用系统资源。但缺点是频繁的连接和断开会增加网络开销,对于高并发场景可能不是最优选择。 ...
在服务器端的多线程开发中,我们首先需要获取主机名和IP地址,然后创建一个Socket对象,并将其绑定到指定的IP地址和端口号上。然后,我们使用Listen方法监听客户端的连接请求,并在.accept方法中创建一个新的...
标题中提到的"TCP/IP客户服务器连接",指的是一个客户端(Client)向服务器(Server)发送请求,服务器响应并提供服务的过程。在C语言中,我们通常使用Berkeley Sockets API来实现这一功能。 在描述中,提到了"实现...
描述中的"一个socket对应多个client,每个socket开启一个新的线程"表明服务器会为每个新的客户端连接创建一个新的socket实例,并且在一个单独的线程中运行,这样就可以避免因一个客户端的阻塞操作(如等待输入)而...
在本文中,我们将深入探讨如何使用C#编程语言通过Socket实现一个简单的聊天系统,使得服务器可以与多个客户端进行通信。Socket在计算机网络编程中扮演着重要角色,它提供了进程间通信(IPC)的能力,允许不同计算机...
在Android客户端与PC服务器建立Socket连接时,它们首先需要建立一个TCP连接,这个过程包括三次握手。TCP协议确保数据包按照顺序发送且无丢失,通过确认、重传机制来保证数据的可靠性。 3. **IP地址**:在代码中,`...
标题 "C语言解析IP数据包程序" 涉及到的是使用C语言编写的一个程序,其主要功能是解析网络中的IP数据包。在计算机网络中,IP数据包是传输层协议IP(Internet Protocol)用于在网络间传递数据的基本单元。这个程序...
`创建了客户端Socket后,`clientSocket.Connect()`用于指定服务器的IP地址和端口号,尝试建立连接。 在双方建立连接后,"发送消息"成为关键。在C#中,我们可以使用Socket的`Send()`方法向对端发送数据。数据通常...
`TCP_server.py`文件通常包含了服务器端的代码,它会创建一个socket对象,绑定到特定的IP地址和端口,然后调用listen()方法监听连接。当有客户端连接时,accept()方法会被阻塞,直到客户端发起连接请求,此时服务器...
在客户端,我们通常会创建一个IP数据包,封装上需要传递的信息,如源IP地址、目标IP地址、协议类型(如TCP或UDP)以及负载数据。使用Scapy,我们可以构建一个IP数据包,然后利用socket库将其发送到服务器。例如: `...
标题提到的"SOCKET实现多线程TCP连接源码"是一个典型的网络编程示例,它演示了如何通过Socket接口处理多个并发客户端连接,并使用多线程来保持与每个客户端的独立通信。 首先,TCP(传输控制协议)是一种面向连接的...
在这个项目中,STM32F750开发板被用来创建一个能同时处理多个PC客户端连接的TCP服务器。下面我们将详细探讨这个Demo中的关键技术点。 首先,STM32F750是一款高性能的微控制器,基于ARM Cortex-M7内核,具有丰富的...
在标题和描述中提到的"一个服务器对多个客户端"的场景,实际上是指服务器端(Server)可以同时与多个客户端(Client)建立连接,进行通信。这种模型在许多网络服务中非常常见,如Web服务器、FTP服务器等。下面将详细...
为了实现异步,你可以使用BeginAccept或AcceptAsync方法,它们会返回一个IAsyncResult对象,允许你在连接建立后执行回调函数。 4. **客户端连接**:客户端使用Connect方法发起连接请求,同样,为了异步,可以使用...
Socket发送数据包是网络编程中的一个关键概念,特别是在C#这样的多用途编程语言中。C#提供了丰富的类库用于创建和操作套接字(Socket),使得开发者能够构建客户端和服务器应用,实现网络上的数据交换。下面我们将...
服务器端通常会创建一个ServerSocket,并绑定到特定的IP地址和端口号,然后调用其accept()方法开始监听连接请求。每当有新的客户端尝试连接时,accept()方法会返回一个新的Socket对象,用于与该客户端的通信。 描述...
本文主要探讨了在Linux环境下,当TCP服务器与客户端建立连接后,服务器在某些情况下无法向客户端正常发送数据的问题。具体场景为:服务器与两个客户端进行连接,并通过epoll机制实现非阻塞模式下的通信。客户端会...