埠複用技術
阿新 • • 發佈:2020-12-09
一、埠對映(埠重定向):
內網主機埠————》外網主機埠。
訪問外網埠————》內網主機埠。
路由器上設定一個埠對映。
外部埠和內部埠一 一對應
二、埠轉發:
埠轉發,有時被叫做隧道:
ip地址和路由器的埠繫結
外部埠和內部IP一 一對應
三、埠複用:
兩個程式,監聽相同的埠。
埠複用技術中最重要的一個函式是setsockopt()
setsockopt() 函式,用於任意型別、任意狀態套介面的設定選項值。
設定socket的SO_REUSEADDR選項,即可實現埠複用
SO_REUSEADDR:套接字繫結多個埠,埠繫結多個套接字
1、多個套接字繫結1個埠
但每個例項繫結的IP地址是不能相同的。(例如路由器)
import socket tcp1 = 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.1, 12345))
2、一個套接字繫結多個埠
每個socket繫結的ip地址不同。
接收一個埠,傳送另一個埠
#coding=utf-8 import socket import sys import select host='192.168.1.8' port=80 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 ) s.bind((host,port)) s.listen(10) S1=socket.socket(socket.AF_INET,socket.SOCK_STREAM) S1.connect(('127.0.0.1',3389)) print "Start Listen 80 =>3389....."while 1: infds,outfds,errfds=select.select([s,],[],[],5) #轉發3389需去除 if len(infds)!=0:#轉發3389需去除 conn,(addr,port)=s.accept() print '[*] connected from ',addr,port data=conn.recv(4096) S1.send(data) recv_data=s1.recv(4096) conn.send(recv_data) print '[-] connected down', S1.close() s.close()