本文介绍Python实现端口复用实例如下所示:
#coding=utf-8import socketimport sysimport selectimport threadinghost='192.168.99.100'port=80class Thread(threading.Thread): def __init__(self,buf,sockfd): threading.Thread.__init__(self) self.buf=buf self.sockfd=sockfd def run(self): if len(self.buf)!=0: if 'GET' in self.buf : #判断是否是浏览器提交的数据如果是则将提交的数据转发至本地环回地址的80端口 s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s2.connect(('127.0.0.1',80)) s2.send(self.buf) bufer='' while 1: recv_data=s2.recv(1024) bufer+=recv_data if len(recv_data)==0: break print bufer,len(bufer) if len(bufer)==0: pass self.sockfd.send(bufer) #将服务器发送的数据发回客户端 s2.close self.sockfd.close sys.exit() else: 'ps:connect to ssh' #如果数据不是浏览器提交则将其转发至本地的22端口 s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s2.connect(('127.0.0.1',22)) s2.send(self.buf) recv_data=s2.recv(4096) conn.send(recv_data) self.sockfd.close s2.closes=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 ) #端口复用的关键点s.bind((host,port))s.listen(10)while 1: infds,outfds,errfds=select.select([s,],[],[],5) #使用select函数进行非阻塞操作 if len(infds)!=0: conn,(addr,port)=s.accept() print 'connected by',addr,port data=conn.recv(1024) t=Thread(data,conn) t.start()s.close#coding=utf-8import socketimport sysimport selectimport threadinghost='192.168.99.100'port=80class Thread(threading.Thread): def __init__(self,buf,sockfd): threading.Thread.__init__(self) self.buf=buf self.sockfd=sockfd def run(self): if len(self.buf)!=0: if 'GET' in self.buf : #判断是否是浏览器提交的数据如果是则将提交的数据转发至本地环回地址的80端口 s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s2.connect(('127.0.0.1',80)) s2.send(self.buf) bufer='' while 1: recv_data=s2.recv(1024) bufer+=recv_data if len(recv_data)==0: break print bufer,len(bufer) if len(bufer)==0: pass self.sockfd.send(bufer) #将服务器发送的数据发回客户端 s2.close self.sockfd.close sys.exit() else: 'ps:connect to ssh' #如果数据不是浏览器提交则将其转发至本地的22端口 s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s2.connect(('127.0.0.1',22)) s2.send(self.buf) recv_data=s2.recv(4096) conn.send(recv_data) self.sockfd.close s2.closes=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 ) #端口复用的关键点s.bind((host,port))s.listen(10)while 1: infds,outfds,errfds=select.select([s,],[],[],5) #使用select函数进行非阻塞操作 if len(infds)!=0: conn,(addr,port)=s.accept() print 'connected by',addr,port data=conn.recv(1024) t=Thread(data,conn) t.start()s.close
例子2
import sockettcp1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#在绑定前调用setsockopt让套接字允许地址重用tcp1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)tcp2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) #接下来两个套接字都也可以绑定到同一个端口上tcp1.bind(('0.0.0.0', 12345))tcp2.bind(('0.0.0.0', 12345))import sockettcp1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#在绑定前调用setsockopt让套接字允许地址重用tcp1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)tcp2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) #接下来两个套接字都也可以绑定到同一个端口上tcp1.bind(('0.0.0.0', 12345))tcp2.bind(('0.0.0.0', 12345))
例子3
重定向
import socket,osbufLen = 4*1024sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock1.bind(('192.168.168.100', 8000)) sock1.listen(5) sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock2.connect(('192.168.168.100', 12345)) while True: connection,address = sock1.accept() buf = connection.recv(bufLen) #print buf sock2.send(buf) connection.send(sock2.recv(bufLen)) connection.close()import socket,osbufLen = 4*1024sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock1.bind(('192.168.168.100', 8000)) sock1.listen(5) sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock2.connect(('192.168.168.100', 12345)) while True: connection,address = sock1.accept() buf = connection.recv(bufLen) #print buf sock2.send(buf) connection.send(sock2.recv(bufLen)) connection.close()
新闻热点
疑难解答
图片精选