Wie man eine einfache proxy in python?

Ich wollte ein sehr einfaches proxy mit python (meist zu verstehen, wie es funktioniert). Ich spreche über einen generischen TCP-proxy, der nicht nur http.
Ich gebaut habe folgenden code, jedoch scheint es nur eine Möglichkeit : ie die Anfrage wird gesendet, aber ich habe nie eine Antwort erhalten. Hier ist der code :

import socket
import argparse

#Args
parser = argparse.ArgumentParser(description='ProxyDescription')
parser.add_argument('-l', '--listen', action='store', help='Listening port', default=80, type=int)
parser.add_argument('destination', action='store', help='Destination host')
parser.add_argument('port', action='store', help='Destination port', type=int)
args = parser.parse_args()

#Server
s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s1.bind(('', args.listen))
s1.listen(1)
conn1, addr1 = s1.accept()

#Client
s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2.connect((args.destination, args.port))
s2.setblocking(0)

print "Connected by ", addr1
while 1:
    datato = conn1.recv(1024)
    if not datato: 
        print "breaking to"
        break
    s2.send(datato)
    print "data send : " + datato
    try:
        datafrom = s2.recv(1024)
        print "reveived data : " + datafrom   
        if not datafrom:
            print "breakinf from"
            break
        print "datafrom: " + datafrom
        conn1.send(datafrom)
    except socket.error, msg:
        print "error rcving: " + str(socket.error) + " || " + str(msg) 
        continue
print "the end ... closing"
conn1.close()
s2.close()

Meinem test einfach starten Sie dieses Skript und telnet durch. Wenn ich sehe mit wireshark sehe ich, dass die Anfrage vollständig vom server verstanden und bekomme ich eine Antwort, jedoch habe ich nie eine Antwort erhalten, in der telnet. (testen mit einfachen GET /auf google)
Ich habe das Gefühl, dass das problem auf "blocking" /"non-blocking" - Buchse, aber ich kann wirklich nicht verstehen, wo es ist.

  • wie viel Daten hast, die conn1.send() angeben, gesendet wurde?
  • es eigentlich nie bekommt gibt es seit dem s2.recv(1024) nicht erhalten nichts :/
  • oh. dann ist es einfach - da s2 ist nicht blockierend, empfangen wird, sofort zurück, und Ihr code wird brechen Sie die Schleife. machen Sie es nicht blockieren und zu sehen! aber das wird nicht gut funktionieren in der realen Welt, die Reale Möglichkeit, es zu tun wird entweder mit einem non-blocking-networking-API, oder mit 2 threads.
InformationsquelleAutor Choumarin | 2012-03-24
Schreibe einen Kommentar