1. 程式人生 > 其它 >埠複用技術

埠複用技術

一、埠對映(埠重定向):

內網主機埠————》外網主機埠。
訪問外網埠————》內網主機埠。

路由器上設定一個埠對映。
外部埠和內部埠一 一對應

二、埠轉發:

埠轉發,有時被叫做隧道:
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()