python socket通信 我覺得是在revc時卡死了 弄了一晚上都沒解決
做一個埠轉發的東西
先說一下背景
開了三臺虛擬機:
pc1:192.168.30.1
pc2:192.168.30.2 192.168.40.2 (兩張網卡)
pc3:192.168.40.1 web服務器
原本pc1是不能訪問pc3的,用這個可以做一個轉發,可以用,但是一會就會直接卡死。
在pc1 上運行ll.py
pc2上運行ss.py
pc1:


pc2:

先在pc1運行ll.py
然后在pc2運行ss.py
在pc1訪問127.0.0.1:20033

卡死后就不能訪問了
這是原始碼
ll.py
import socket
import select
import time
# Lcx -Listen <監聽slave請求的埠(對應slave 的第二個引數)> <等待連接的埠>
def listen():
global s0,s1
ip1 = "0.0.0.0"
port1 = 20033
ip2 = "0.0.0.0"
port2 = 10033
s0_target = (ip1,port1)
s1_target = (ip2,port2)
s0 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# s0.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# s0.setblocking(0)
s0.bind(s0_target)
s0.listen(5)
s1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# s1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# s1.setblocking(0)
s1.bind(s1_target)
s1.listen(5)
print("******Waiting Accept******\n")
t0,addr=s0.accept()
t1,addr=s1.accept()
# t0.setblocking(0)
# t1.setblocking(0)
print("******Accept Success******\n")
t=[t0,t1]
transfer(t)
def transfer(t):
flag1 = 1
print("ok1")
while flag1 and select.select(t,[],[]):
print(flag1)
print("ok2")
for i in range(2):
buf=bytes()
# ***********************************
while True:
print("tmp_bf u= t[",i,"].recv(8192)")
tmp_buf = t[i].recv(8192)
print("?????")
buf += tmp_buf
print("ok4")
if len(tmp_buf) < 8192:
print("ok5")
break
print("ok7")
if len(buf)>0:
print("[+]接收--",t[i].getpeername(),"<-->",t[i].getsockname(),"長度--",len(buf),"Byte")
# ***********************************
if len(buf)>0 and t[i==0].send(buf)>0:
print("[+]發送--",t[i==0].getsockname(),"<-->",t[i==0].getpeername(),"長度--",len(buf),"Byte")
else:
print("ok8")
flag1 = 0
print(flag1)
t[0].close()
print("t[0].close()")
t[1].close()
listen()
s0.close()
print("s0.close()")
s1.close()
ss.py
import socket
import select
import time
def slave():
global s0,s1
ip1 = "192.168.30.1"
port1 = 10033
ip2 = "192.168.40.1"
port2 = 80
s0_target = (ip1,port1)
s1_target = (ip2,port2)
s0 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# s0.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# s1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# s0.setblocking(0)
# s1.setblocking(0)
print("******Waiting Connect******\n")
ok=s0.connect(s0_target)
ok=s1.connect(s1_target)
print("******Connect Success******\n")
t=[s0,s1]
transfer(t)
def transfer(t):
flag1 = 1
# f1,f2,f3 = select.select(t,[],[],1)
while flag1 and select.select(t,[],[]):
print(flag1)
print("ok2")
for i in range(2):
buf=bytes()
# ***********************************
while True:
print("tmp_bf u= t[",i,"].recv(8192)")
tmp_buf = t[i].recv(8192)
print("?????")
buf += tmp_buf
print("ok4")
if len(tmp_buf) < 8192:
print("ok5")
break
print("ok7")
if len(buf)>0:
print("[+]接收--",t[i].getpeername(),"<-->",t[i].getsockname(),"長度--",len(buf),"Byte")
# ***********************************
if len(buf)>0 and t[i==0].send(buf)>0:
print("[+]發送--",t[i==0].getsockname(),"<-->",t[i==0].getpeername(),"長度--",len(buf),"Byte")
else:
print("ok8")
flag1 = 0
print(flag1)
t[0].close()
print("t[0].close()")
t[1].close()
slave()
s0.close()
print("s0.close()")
s1.close()
里面print是除錯加的
求各位大哥幫忙看看。。。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278621.html
