#!/usr/bin/env python

import sys
import os
import socket
import select
import Queue
import datetime

if len(sys.argv) == 4:
	listenPort = int(sys.argv[1])
	serverHost = sys.argv[2]
	serverPort = int(sys.argv[3])
	listenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	listenSocket.bind(("", listenPort))
	listenSocket.listen(0)
else:
	raise SystemExit("Usage: " + os.path.basename(sys.argv[0]) + " listenPort serverHost serverPort")

while True:
	clientConnection, clientAddress = listenSocket.accept()
	print "Accepted connection from", clientAddress
	serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	serverSocket.connect((serverHost, serverPort))
	print "Connected to server"
	prevButtonMask = 0
	while True:
		readable, writeable, exceptions = select.select([clientConnection, serverSocket], [clientConnection, serverSocket], [clientConnection, serverSocket])
		if clientConnection in readable and serverSocket in writeable:
			dataFromClient = clientConnection.recv(8192*1024)
			if 0 == len(dataFromClient):
				print str(datetime.datetime.now().time()) + " Client closed connection"
				clientConnection.close()
				serverSocket.close()
				break
			#print "Received", len(dataFromClient), "Bytes from client"
			serverSocket.sendall(dataFromClient)
			
			print str(datetime.datetime.now().time()) + " Client: '" + dataFromClient.encode("hex") + "' - '" + "".join([i if i.isalnum() else "." for i in dataFromClient]) + "'"

			#print "Sent data to server"
		if serverSocket in readable and clientConnection in writeable:
			dataFromServer = serverSocket.recv(8192*1024)
			if 0 == len(dataFromServer):
				print str(datetime.datetime.now().time()) + " Server closed connection"
				clientConnection.close()
				serverSocket.close()
				break
			#print "Received", len(dataFromServer), "Bytes from server"
			clientConnection.sendall(dataFromServer)
			print str(datetime.datetime.now().time()) + " Server: '" + dataFromServer.encode("hex") + "' - '" + "".join([i if i.isalnum() else "." for i in dataFromServer]) + "'"

		if len(exceptions):
			connection.close()
			serverSocket.close()
			break
			
