Pythonポート多重インスタンスコード

4883 ワード

Python実装ポート多重インスタンスコード
Pythonはポート多重化を実現する:
#coding=utf-8

import socket

import sys

import select

import threading

host='192.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 :  #www.jbxue.com                                  80  

     s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

     s2.connect(('127.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)  #              

     s2.close

     self.sockfd.close

     sys.exit()

    else:

     'ps:connect to ssh' #                    22  

     s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

     s2.connect(('127.0.0.1',22))

     s2.send(self.buf)

     recv_data=s2.recv(4096)

     conn.send(recv_data)

     self.sockfd.close

     s2.close

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)

while 1:

 infds,outfds,errfds=select.select([s,],[],[],5) #  select         

 if len(infds)!=0:

  conn,(addr,port)=s.accept()

  print 'connected by',addr,port

  data=conn.recv(1024)

  t=Thread(data,conn)

  t.start()

s.close

#coding=utf-8

import socket

import sys

import select

import threading

host='192.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 :  #                                 80  

     s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

     s2.connect(('127.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)  #              

     s2.close

     self.sockfd.close

     sys.exit()

    else:

     'ps:connect to ssh' #                    22  

     s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

     s2.connect(('127.0.0.1',22))

     s2.send(self.buf)

     recv_data=s2.recv(4096)

     conn.send(recv_data)

     self.sockfd.close

     s2.close

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)

while 1:

 infds,outfds,errfds=select.select([s,],[],[],5) #  select         

 if len(infds)!=0:

  conn,(addr,port)=s.accept()

  print 'connected by',addr,port

  data=conn.recv(1024)

  t=Thread(data,conn)

  t.start()

s.close

例2
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)

 #                     (www.jbxue.com)

tcp1.bind(('0.0.0.0', 12345))

tcp2.bind(('0.0.0.0', 12345))

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.0', 12345))

例3リダイレクト
import socket,os

bufLen = 4*1024

sock1 = 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,os

bufLen = 4*1024

sock1 = 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()