Python实现端口复用实例代码
作者:shichen2014 发布时间:2023-12-16 19:58:32
标签: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 : #判断是否是浏览器提交的数据如果是则将提交的数据转发至本地环回地址的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)
#接下来两个套接字都也可以绑定到同一个端口上
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()
0
投稿
猜你喜欢
- 常见的SQL问题:◆选择重复,消除重复和选择出序列有例表:empemp_no name age001 Tom 17002 Sun 14003
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 11 - Using Fx.Morph, Fx O
- 如果用户输入的是直接插入到一个SQL语句中的查询,应用程序会很容易受到SQL注入,例如下面的例子:$unsafe_variable = $_
- 代码如下:<?php$a;$b = false;$c = '';$d = 0;$e = null;$f = array
- 作为一个MySQL的系统管理员,你有责任维护你的MySQL数据库系统的数据安全性和完整性。本文主要主要介绍如何建立一个安全的MySQL系统,
- 如下所示:import itchat, timefrom itchat.content import TEXT#name = ' &
- 本文出自“Python为什么”系列,归档在 Github 上:https://github.com/chinesehuazhou/pytho
- <?php function genpage(&$sql,$page_size=10) { global $pages,$su
- 一、picklepickle模块用来实现python对象的序列化和反序列化。通常地pickle将python对象序列化为二进制流或文件。&n
- 以下的实例为去除指定表中数据类型是VARCHAR,CHAR,NVARCHAR的字段值中的不可见字符。 注释:此处只去掉前后的不可见字符,不包
- 判断字符串长度函数:<SCRIPT LANGUAGE="JavaScript"><!--fu
- 各位想必都知道,onfocus="this.blur()"这条代码能消除链接时的虚线框,但你有没有想过,如果你的网页上有
- 一、原因:今天在尝试初始化一个WEB应用的时候,发现其连接不上MySQL,从Traceback看到使用的默认密码为‘YES’。没辙,居然尝试
- 一、前言在学习深度学习会发现都比较爱用python这个argparse,虽然基本能理解,但没有仔细自己动手去写,因此这里写下来作为自己本人的
- 简单的地图读取、展示终于到暑假了。。。开始认真整理整理相关学习的心得体会咯~先把很久之前挖的关于C# 二次开发的坑给填上好了~ 这次先计划用
- Apache2 httpd.conf 中文版 # # 基于 NCSA 服务的配
- 说起模板引擎,很多人会认为这是后台的东西(如PHP的Smarty、Java的Velocity),跟前端没有关系。然而,随着前端的逻辑变得越来
- 本文实例讲述了php从文件夹随机读取文件的方法。分享给大家供大家参考。具体实现方法如下:function RandomFile($folde
- 如下所示:#encoding=utf-8print '中国'#字典的一键多值print'方案一 list作为dict
- 简介Go的标准包Container中包含了常用的容器类型,包括conatiner/list,container/heap,container