端口复用技术

一、端口映射(端口重定向):

内网主机端口————》外网主机端口。
访问外网端口————》内网主机端口。

路由器上设置一个端口映射。
外部端口和内部端口一 一对应

二、端口转发:

端口转发,有时被叫做隧道:
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()

你可能感兴趣的:(端口复用技术)