Python實(shí)現(xiàn)端口復(fù)用實(shí)例代碼
本文介紹Python實(shí)現(xiàn)端口復(fù)用實(shí)例如下所示:
#coding=utf-8 import socket import sys import select import threading host='192.168.99.100' port=80 class 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 : #判斷是否是瀏覽器提交的數(shù)據(jù)如果是則將提交的數(shù)據(jù)轉(zhuǎn)發(fā)至本地環(huán)回地址的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) #將服務(wù)器發(fā)送的數(shù)據(jù)發(fā)回客戶端 s2.close self.sockfd.close sys.exit() else: 'ps:connect to ssh' #如果數(shù)據(jù)不是瀏覽器提交則將其轉(zhuǎn)發(fā)至本地的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.close s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 ) #端口復(fù)用的關(guān)鍵點(diǎn) s.bind((host,port)) s.listen(10) while 1: infds,outfds,errfds=select.select([s,],[],[],5) #使用select函數(shù)進(jìn)行非阻塞操作 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-8 import socket import sys import select import threading host='192.168.99.100' port=80 class 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 : #判斷是否是瀏覽器提交的數(shù)據(jù)如果是則將提交的數(shù)據(jù)轉(zhuǎn)發(fā)至本地環(huán)回地址的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) #將服務(wù)器發(fā)送的數(shù)據(jù)發(fā)回客戶端 s2.close self.sockfd.close sys.exit() else: 'ps:connect to ssh' #如果數(shù)據(jù)不是瀏覽器提交則將其轉(zhuǎn)發(fā)至本地的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.close s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 ) #端口復(fù)用的關(guān)鍵點(diǎn) s.bind((host,port)) s.listen(10) while 1: infds,outfds,errfds=select.select([s,],[],[],5) #使用select函數(shù)進(jìn)行非阻塞操作 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 socket tcp1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #在綁定前調(diào)用setsockopt讓套接字允許地址重用 tcp1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) tcp2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) #接下來(lái)兩個(gè)套接字都也可以綁定到同一個(gè)端口上 tcp1.bind(('0.0.0.0', 12345)) tcp2.bind(('0.0.0.0', 12345)) import socket tcp1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #在綁定前調(diào)用setsockopt讓套接字允許地址重用 tcp1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) tcp2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) #接下來(lái)兩個(gè)套接字都也可以綁定到同一個(gè)端口上 tcp1.bind(('0.0.0.0', 12345)) tcp2.bind(('0.0.0.0', 12345))
例子3
重定向
import socket,os bufLen = 4*1024 sock1 = 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,os bufLen = 4*1024 sock1 = 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()
相關(guān)文章
使用Django+Vue編寫(xiě)一個(gè)文件上傳器
本教程中,我將會(huì)使用Django和Vue創(chuàng)建一個(gè)支持多文件上傳的文件上傳器,您可以在單個(gè)文件和多個(gè)文件上傳之間選擇在應(yīng)用中進(jìn)行上傳操作,文章通過(guò)代碼示例截殺的非常詳細(xì),需要的朋友可以參考下2023-11-11TensorFLow 數(shù)學(xué)運(yùn)算的示例代碼
這篇文章主要介紹了TensorFLow 數(shù)學(xué)運(yùn)算的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04使用Python連接MySQL數(shù)據(jù)庫(kù)進(jìn)行編程的步驟詳解
Python數(shù)據(jù)庫(kù)編程可以使用多種模塊與API,例如SQLite、MySQL、PostgreSQL等,本教程將重點(diǎn)介紹使用Python連接MySQL數(shù)據(jù)庫(kù)進(jìn)行編程,需要的朋友可以參考下2023-06-06Python代碼一鍵轉(zhuǎn)Jar包及Java調(diào)用Python新姿勢(shì)
這篇文章主要介紹了Python一鍵轉(zhuǎn)Jar包,Java調(diào)用Python新姿勢(shì),本文通過(guò)截圖實(shí)例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03python write無(wú)法寫(xiě)入文件的解決方法
今天小編就為大家分享一篇python write無(wú)法寫(xiě)入文件的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python畫(huà)圖工具M(jìn)atplotlib庫(kù)常用命令簡(jiǎn)述
這篇文章主要介紹了Python畫(huà)圖Matplotlib庫(kù)常用命令簡(jiǎn)述總結(jié),文中包含詳細(xì)的圖文示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09在Linux中通過(guò)Python腳本訪問(wèn)mdb數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了在Linux中通過(guò)Python腳本訪問(wèn)mdb數(shù)據(jù)庫(kù)的方法,本文示例基于debian系的Linux系統(tǒng),需要的朋友可以參考下2015-05-05