1

プロキシのように機能する python アプリを実装しようとしました (ポート 22 用)。コードは次のとおりです。

import socket
import select
import code
inputSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
inputSock.bind( ('',9999) )
inputSock.listen(5)
socks = {} #a dictionary!

#Now, wait for an input!
while 1:
    #accept new conns
    (sread,swrite,sexec) = select.select([inputSock],[],[])
    for sock in sread:
        print("Got an input!")
        newsock,(remhost,remport) = sock.accept()
        sendsock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        try:
            print("Now connecting to the centOS...")
            sendsock.connect( ('202.131.30.12',80))
        except:
            print("ERROR: cannot connect to host 192.168.52.128:22")
        print("successfully connected to Cent. Creating new socks")
        socks[id(sendsock)] = newsock
        socks[id(newsock)] = sendsock
        print("socks created!")
    #recv from socks, etc.
    (sread,swrite,sexec) = select.select(socks.values(),[],[])
    for sock in sread:
        print("got input!")
        data = sock.recv(700)
        print(data)
        if(data == ""):
            #remove that sock.
            id1 = id(sock)
            id2 = id(socks[id1])
            socks.pop(id1)
            socks.pop(id2)
            print("removed empty conns")
        else:
            #code.interact(globals=globals())
            sendSock = socks[id(sock)]
            sendSock.send(data)
            print("data sent!")

ここで、スクリプトを実行し、ブラウザーで 127.0.0.1:9999 を指定すると、ブラウザーは Web ページを取得しません (「Web ページを永久にロードする」状態になります)。そして、これは私がpythonプロンプトから得たものです: http://imgur.com/CffOY

どこが間違っていたのかを見つけて、この実験的な実装を修正するのを手伝ってくれませんか? (または、アイデアを得るためのリンクをいくつか教えてください。)ありがとう:)

4

1 に答える 1

0

ブラウザーから HTTP 要求の一部 (部分的である可能性があります) のデータを読み取り、それを他のソケットのサーバーに送信しました。次に、外側のループによってリッスン ソケットに戻りselect、新しい接続の待機がブロックされるため、行き詰まります。

への両方の呼び出しを 1 つにマージしますselect。リッスン ソケットの特別なケースを作成するだけです。

于 2012-12-11T13:48:05.003 に答える