TopCoderプロキシ
TopCoderのArenaはJavaWebStartで、www.topcoder.com:80からソフトウェアをダウンロードした後www.topcoder.com:5001にアクセスをする。というわけでwww.topcoder.comは普段は66.37.210.86。というわけでhostsを書き換えてwww.topcoder.comが127.0.0.1を指すようにした上でローカルで下のようなスクリプトを起動。
(削除されました)
これでTopCoderのサイトからJavaWebStartで起動するところまではうまくいくのだけど、ログインをしようとするとタイムアウトになる。なんでだろうなぁ。
出力は
(削除されました)
って感じなので、サーバの返答を受信して、返事が来ないから全部受信し終わったと考えてクローズしているところが実は焦りすぎということなんだろうか。
-
-
-
- -
-
-
あ、そっか。HTTPと違うからサーバに送って、サーバから返事が返ってきても終わりじゃないんだ。そこでcloseしちゃダメだな。
got result, len 31 sending result sent result getting result timeout('timed out',) ---------- getting data got data, len 41 sending data sent data getting data
やっぱりそうだった。しかし、じゃぁどういうときにcloseすればいいんだろうか。
-
-
-
- -
-
-
とりあえず、他の人の書いたファイルをダウンロードできるようになった。
""" topcoder proxy """ import SocketServer class ProxyHandler(SocketServer.StreamRequestHandler): PORT = 5001 def handle(self): print "connect from:", self.client_address s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print "connecting to TopCoder" s.connect(("66.37.210.86", self.PORT)) print "connected to TopCoder" from time import sleep TO_CLOSE = False while not TO_CLOSE: try: while True: print "getting data", data = self.request.recv(8192) print "got data, len", len(data) if len(data) == 0: TO_CLOSE = True break print "sending data", s.send(data) print "sent data" except Exception, e: print repr(e) try: while True: print "getting result", result = s.recv(8192) print "got result, len", len(result) if len(result) == 0: TO_CLOSE = True break if "#include" in result: print "code found!" start = result.index("#include") end = result.index("\x00", start) import time filename = time.strftime( r"C:\topcoder\dl\%m%d_%H%M%S.cpp") file(filename, "w").write(result[start:end]) print "sending result", self.request.send(result) print "sent result" except Exception, e: print repr(e) print "----------" sleep(1) s.close() self.request.close() class ProxyHandler80(ProxyHandler): PORT = 80 import thread import socket socket.setdefaulttimeout(1.0) server = SocketServer.ThreadingTCPServer(('localhost', 5001), ProxyHandler) print 'listening:', server.socket.getsockname() thread.start_new_thread(server.serve_forever, ()) server = SocketServer.ThreadingTCPServer(('localhost', 80), ProxyHandler80) print 'listening:', server.socket.getsockname() thread.start_new_thread(server.serve_forever, ())