複数のクライアント接続を受け入れる単純な 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))
しかし、私はまだそれを実装する方法を理解しようとしています。