2012-01-07 3 views
1

これは、実際には私のpostに、Pythonのoauth2 BaseHTTPServerとSABNzbd +との競合についてのフォローアップです。PythonのhttpdはWindowsでソケットエラーを投げずに使用されたポートでリッスンしますが、OS Xではリッスンしません。

基本的に、私は(GoogleのAPIののOAuth2認証情報の入力を聞いて、ローカルサーバーを作成するために使用される)以下の小さなスクリプトを持っている:OS X上で

import socket 
import BaseHTTPServer 
from oauth2client.tools import ClientRedirectServer, ClientRedirectHandler 

port_number = 0 
host_name = 'localhost' 
for port_number in range(8080,10000): 
    try: 
     httpd = ClientRedirectServer((host_name, port_number), 
            ClientRedirectHandler) 
    except socket.error, e: 
     print "socket error: " + str(e) 
     pass 
    else: 
     print "The server is running on: port " + str(port_number) 
     print "and host_name " + host_name 
     httpd.serve_forever() 
     break 

、私は二回このスクリプトを実行する場合、私が手期待される結果:

socket error: [Errno 48] Address already in use 
The server is running on: port 8081 
and host_name localhost 

しかし、Win7ので異なるCMDウィンドウから同じスクリプトを実行している、私は喜んでソケットエラーをスローせずに同じポート(8080)上の3台のまたは4のサーバーを実行することができます。

C:\>netstat -abn | Findstr 8080 
TCP 127.0.0.1:8080 0.0.0.0:0 LISTENING 
TCP 127.0.0.1:8080 0.0.0.0:0 LISTENING 

答えて

0

Per Ned Deilyのcommentでは、Windowsは他のOSと同じ方法で複数のソケットを扱いません。

Windowsでこれを行う正しい方法(と私のために働く方法、したがって私が選択する方法)は、ポートを0にバインドしてWindowsでそれを処理させることだと思います。使用済みのポート番号をsock.getsockname()[1]で戻すことができます。グーグルのoauth2client.toolsでこれをやろうとしている他の誰のために

、私は以下のと一緒に行きましたコードを参照してください。

import socket 
import BaseHTTPServer 
from oauth2client.tools import ClientRedirectServer, ClientRedirectHandler 

port_number = 0 
host_name = 'localhost' 
try: 
    httpd = ClientRedirectServer((host_name, port_number), ClientRedirectHandler) 
except socket.error, e: 
    print "socket error: " + str(e) 
else: 
    print "The server is running on: port " + str(httpd.socket.getsockname()[1]) 
    print "and host_name " + host_name 
    httpd.serve_forever() 
1

明らかに、WindowsはほとんどのUnix-yシステムと同じアドレス/ポートに複数のソケットをバインドするという意味が異なります。例えば、this Python issueを参照されたい。

0

複数のアプリケーションを同じエンドポイントにフックさせることはできません。

関連する問題