This article describes how to implement port multiplexing in Python as follows:
# Coding = utf-8import socketimport sysimport selectimport threadinghost = '2017. 168.99.100 'port = 80 class Thread (threading. thread): def _ init _ (self, buf, sockfd): threading. thread. _ init _ (self) self. buf = buf self. sockfd = sockfd def run (self): if len (self. buf )! = 0: if 'get' in self. buf: # determine whether the data is submitted by the browser. If yes, forward the submitted data to port 80 of the local loopback address, s2 = socket. socket (socket. AF_INET, socket. SOCK_STREAM) s2.connect ('2017. 0.0.1 ', 80) s2.send (self. buf) bufer = ''while 1: recv_data = s2.recv (1024) bufer + = recv_data if len (recv_data) = 0: break print bufer, len (bufer) if len (bufer) = 0: pass self. sockfd. send (bufer) # send the data sent by the server back to the client s2.close self. sockfd. close sys. exit () else: 'ps: connect to ssh' # If the data is not submitted by the browser, forward it to the local 22 port s2 = socket. socket (socket. AF_INET, socket. SOCK_STREAM) s2.connect ('2017. 0.0.1 ', 22) s2.send (self. buf) recv_data = s2.recv (4096) conn. send (recv_data) self. sockfd. close s2.closes = socket. socket (socket. AF_INET, socket. SOCK_STREAM) s. setsockopt (socket. SOL_SOCKET, socket. SO_REUSEADDR, 1) # key point of port reuse s. bind (host, port) s. listen (10) while 1: infds, outfds, errfds = select. select ([s,], [], [], 5) # Use the select function for non-blocking operations if len (infds )! = 0: conn, (addr, port) = s. accept () print 'connectedby', addr, port data = conn. recv (1024) t = Thread (data, conn) t. start () s. close # coding = utf-8import socketimport sysimport selectimport threadinghost = '2017. 168.99.100 'port = 80 class Thread (threading. thread): def _ init _ (self, buf, sockfd): threading. thread. _ init _ (self) self. buf = buf self. sockfd = sockfd def run (self): if len (self. buf )! = 0: if 'get' in self. buf: # determine whether the data is submitted by the browser. If yes, forward the submitted data to port 80 of the local loopback address, s2 = socket. socket (socket. AF_INET, socket. SOCK_STREAM) s2.connect ('2017. 0.0.1 ', 80) s2.send (self. buf) bufer = ''while 1: recv_data = s2.recv (1024) bufer + = recv_data if len (recv_data) = 0: break print bufer, len (bufer) if len (bufer) = 0: pass self. sockfd. send (bufer) # send the data sent by the server back to the client s2.close self. sockfd. close sys. exit () else: 'ps: connect to ssh' # If the data is not submitted by the browser, forward it to the local 22 port s2 = socket. socket (socket. AF_INET, socket. SOCK_STREAM) s2.connect ('2017. 0.0.1 ', 22) s2.send (self. buf) recv_data = s2.recv (4096) conn. send (recv_data) self. sockfd. close s2.closes = socket. socket (socket. AF_INET, socket. SOCK_STREAM) s. setsockopt (socket. SOL_SOCKET, socket. SO_REUSEADDR, 1) # key point of port reuse s. bind (host, port) s. listen (10) while 1: infds, outfds, errfds = select. select ([s,], [], [], 5) # Use the select function for non-blocking operations if len (infds )! = 0: conn, (addr, port) = s. accept () print 'connectedby', addr, port data = conn. recv (1024) t = Thread (data, conn) t. start () s. close
Example 2
Import sockettcp1 = socket. socket (socket. AF_INET, socket. SOCK_STREAM) tcp2 = socket. socket (socket. AF_INET, socket. SOCK_STREAM) # Call setsockopt before binding to allow the socket to allow address reuse tcp1.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEPORT, 1) tcp2.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEPORT, 1) # The next two sockets can also be bound to the same port tcp1.bind ('0. 0.0.0 ', 12345) tcp2.bind ('0. 0.0.0 ', 12345) import sockettcp1 = socket. socket (socket. AF_INET, socket. SOCK_STREAM) tcp2 = socket. socket (socket. AF_INET, socket. SOCK_STREAM) # Call setsockopt before binding to allow the socket to allow address reuse tcp1.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEPORT, 1) tcp2.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEPORT, 1) # The next two sockets can also be bound to the same port tcp1.bind ('0. 0.0.0 ', 12345) tcp2.bind ('0. 0.0.0 ', 12345 ))
Example 3
Redirection
import socket,osbufLen = 4*1024sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock1.bind(('192.168.168.100', 8000)) sock1.listen(5) sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock2.connect(('192.168.168.100', 12345)) while True: connection,address = sock1.accept() buf = connection.recv(bufLen) #print buf sock2.send(buf) connection.send(sock2.recv(bufLen)) connection.close()import socket,osbufLen = 4*1024sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock1.bind(('192.168.168.100', 8000)) sock1.listen(5) sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock2.connect(('192.168.168.100', 12345)) while True: connection,address = sock1.accept() buf = connection.recv(bufLen) #print buf sock2.send(buf) connection.send(sock2.recv(bufLen)) connection.close()