88 lines
2.2 KiB
Python
Executable File
88 lines
2.2 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
import socket
|
|
import select
|
|
import sys
|
|
import os
|
|
|
|
def tcpbug(listenaddr, destaddr, outputfd):
|
|
listen = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
listen.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
listen.bind(listenaddr)
|
|
listen.listen(1)
|
|
|
|
client, addr = listen.accept()
|
|
|
|
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
server.connect(destaddr)
|
|
|
|
cwbuf = swbuf = outbuf = ''
|
|
|
|
while client or server or outbuf:
|
|
readset = []
|
|
if client:
|
|
readset.append(client)
|
|
if server:
|
|
readset.append(server)
|
|
|
|
writeset = []
|
|
if cwbuf and client:
|
|
writeset.append(client)
|
|
if swbuf and server:
|
|
writeset.append(server)
|
|
if outbuf:
|
|
writeset.append(outputfd)
|
|
|
|
readset, writeset, e = select.select(readset, writeset, [])
|
|
|
|
if client in readset:
|
|
data = client.recv(2000)
|
|
if data:
|
|
swbuf = swbuf + data
|
|
outbuf = outbuf + 'C%d\n%s' % (len(data), data)
|
|
else:
|
|
client = None
|
|
|
|
if server in readset:
|
|
data = server.recv(2000)
|
|
if data:
|
|
cwbuf = cwbuf + data
|
|
outbuf = outbuf + 'S%d\n%s' % (len(data), data)
|
|
else:
|
|
server = None
|
|
|
|
if client in writeset:
|
|
n = client.send(cwbuf)
|
|
cwbuf = cwbuf[n:]
|
|
|
|
if server in writeset:
|
|
n = server.send(swbuf)
|
|
swbuf = swbuf[n:]
|
|
|
|
if outputfd in writeset:
|
|
n = os.write(outputfd, outbuf)
|
|
outbuf = outbuf[n:]
|
|
|
|
if client and not cwbuf and not server:
|
|
client.close()
|
|
client = None
|
|
|
|
if server and not swbuf and not client:
|
|
server.close()
|
|
server = None
|
|
|
|
def main():
|
|
try:
|
|
lport = int(sys.argv[1])
|
|
dhost = sys.argv[2]
|
|
dport = int(sys.argv[3])
|
|
except (IndexError, ValueError):
|
|
sys.stderr.write('Usage: %s listenport desthost destport\n'
|
|
% sys.argv[0])
|
|
exit(1)
|
|
|
|
tcpbug(('', lport), (dhost, dport), 1)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|