我正在尝试构建一个接受多个客户端连接的简单 TCP 中继。
Client1 --> TCPrelay1 --> RealServer1 --> TCPrelay1 --> Client1
Client2 --> TCPrelay1 --> RealServer1 --> TCPrelay1 --> Client2
Client3 --> TCPrelay1 --> RealServer1 --> TCPrelay1 --> Client3
在这件事上有些东西。真正的客户数量没有限制
我在这里找到了一个 UDP 中继脚本。
我试图将其修改为 TCP。我对python套接字真的很陌生。那么我的代码有什么问题呢?什么都没有发生。而且它没有中继。
#SOCK_STREAM --TCP
localPort = 5000
remotePort = 5000
#SV
remoteHost = "xxxxx"
try:
localPort = int(localPort)
except:
fail('Invalid port number: ' + str(localPort))
try:
remotePort = int(remotePort)
except:
fail('Invalid port number: ' + str(remotePort))
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', localPort))
s.listen(1)
except:
fail('Failed to bind on port ' + str(localPort))
knownClient = None
while True:
conn, addr = s.accept()
conn2, addr2 = s.connect((remoteHost, remotePort))
data = connection.recv(1024)
if knownClient is None:
knownClient = addr
if addr == knownClient:
s.sendall(data)
print "Sent : " + ":".join("{0:X}".format(ord(c)) for c in data)
else:
s.sendall(data)
print "Received : " + ":".join("{0:X}".format(ord(c)) for c in data)
[忽略]
做了一些研究,在另一个 SO 问题上发现了这个逻辑:
import select
def fromAtoB(A, B):
r, w = select.select([A], [B], [])
if not r: select.select([A], [], [])
elif not w: select.select([], [B], [])
B.sendall(A.recv(4096))
但我仍在尝试了解如何实现它。