1. 程式人生 > >玩轉網路-TCP代理-3

玩轉網路-TCP代理-3

TCP代理

什麼是代理
瞭解一下什麼是Proxy?
當我們有三臺機器,1號和2號沒法互相通訊,可能由於各種各樣的網路原因沒法通訊,可能是內網機器被隔絕,也有可能是防火牆一些其他原因,而3號又能跟2號通訊,也能跟1號通訊,所以我們在2號上面執行TCP代理,把我們流量進行中轉
在這裡插入圖片描述
設計代理
我們要先想一下,一個socket能同時與幾個端進行通訊呢?答案:2個
因為我一個send資料,一個recv資料,send與recv兩個過程其實就是兩個端在做

如果要實現3個主機進行通訊,所以要用新的socket進行轉發到的機子上
這就是一個代理的過程
在這裡插入圖片描述

實現代理

首先我們就不用真實壞境,就寫一個客戶端和服務端
服務端TestServer

#coding:utf-8
from socket import *
s=socket(AF_INET,SOCK_STREAM)
s.bind(('',6666))
s.listen(1)
while True:
	sock,addr = s.accept		#接收一下請求連結
	print 'Connected by',addr
	data = sock.recv(1024)
	print data
	sock.send('Yes')

客戶端TestServer
啟動我們的客戶端需要
python TestServer.py 6666

coding:utf-8

from socket import * 
import sys			#匯入一個標準庫

HOST = '127.0.0.1'

#argv是一個列表,0位裝的是本身檔案的路徑
#1位裝的是cmd>test.py abcd cdef,就是abcd這一塊
#2位裝的就是cdef
#如果是[1:]就是['abcd','cdef']
PORT = sys.argv[1]	

c = socket(AF_INET,SOCK_STREAM)
c.connect(('127.0.0.1',int(PORT)))		#因為arge取出來的都是字元型,所有用int進行轉意
print 'Connect sucess.'
c.send('YES or NO?')
data = c.recv(1024)
print data
c.close()
coding:utf-8
from socket import *
from sys import *
#匯入模組

def Usage():					#定義一個幫助文件的函式
	print '[Usage]TCPProxy.py [TargetHost] [TargetPort]'
	
try:
	THOST = argv[2]				#一旦沒有讀取到則執行Usage()函式
	int(TPORT) =`int(argv[3])				
except:
	print 'Please input pram.'

MainSocket = socket(AF_INET,SOCK_STREAM)		#定義主體的socket,全域性變數
RemoteSocket = socket(AF_INET,SOCK_STREAM)									#定義遠端socket

def SetSocket(PORT):			#定義函式,這個函式的作用就是繫結本機埠
	MainSocket.bind(('',PORT))	#繫結本機和埠
	MainSocket.listen(1)	#定義最大連結

def ForwardData(Data)			#定義一個轉發的函式
	RemoteSocket.connect((THOST,TPORT))
	RemoteSocket.send(Data)		#傳送轉發的內容
	Rdata = RemoteSocket.recv(1024)		#接收要轉發的內容
	RemoteSocket.close()				#關閉socket
	return Rdata		#返回轉發內容

def MainHandle():		#這個是程式主要的函式,處理客戶端與另一個主機通訊的中間代理
	MainSocket,MainAddr = MainSocket.accept()		#接收一下請求連結
	print 'Connected by',MainAddr
	While True:
		Ldata = MainSock.recv(1024)			#接收客戶端要轉發的內容
		Rdata = ForwardData(Ldata)			#將轉發內容賦值給Rdata
		MainSock.send(Rdata)					#傳送轉發內容
	
if__name__=='__main__':
	try:
		LPORT= int(argv[1]) 				#讓使用者填寫本機連結埠
		SetSocket(LPORT)			#呼叫我們自己設定的函式繫結LPORT埠
		MainHandle()
	except:
		Usage()
``