Tecnología de multiplexación de puertos

1. Mapeo de puertos (redirección de puertos):

Puerto de host de la intranet ————》 Puerto de host de la extranet.
Acceso al puerto de red externo ———— "Puerto de host de intranet.

Configure una asignación de puertos en el enrutador.
Correspondencia uno a uno entre puertos externos y puertos internos

2. Reenvío de puertos:

Reenvío de puertos, a veces llamado túnel:
dirección IP y enlace de puerto del enrutador

Correspondencia uno a uno entre el puerto externo y la IP interna

3. Multiplexación de puertos:

Los dos programas escuchan en el mismo puerto.

La función más importante en la tecnología de multiplexación de puertos es la función setsockopt ()
setsockopt (), que se utiliza para establecer valores de opción de cualquier tipo y cualquier estado de socket.
Configure la opción SO_REUSEADDR del socket para lograr la reutilización del puerto
Inserte la descripción de la imagen aquí

SO_REUSEADDR: el socket está vinculado a varios puertos y el puerto está vinculado a varios sockets

1. Varios enchufes están vinculados a 1 puerto

Pero la dirección IP vinculada a cada instancia no puede ser la misma. (Por ejemplo, enrutador)


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. Un socket une varios puertos

La dirección IP vinculada a cada conector es diferente.
Reciba un puerto, envíe otro puerto


#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()

Supongo que te gusta

Origin blog.csdn.net/qq_42882717/article/details/110830501
Recomendado
Clasificación