2011-11-12 7 views
1

何らかの理由で、選択したソケットをソケットの辞書に一致させることができません。以下のコードは、誰かがacceptを接続するときにソケットの辞書を作成します(そうではありません)。これは、「L」に「S」見つかったが、その後はないsocket.error: [Errno 22] Invalid argument選択したPythonソケット辞書

listening = {} 
L = [] 
for link in links: 
    try: 
     # listening 
     listening[link] = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     listening[link].bind((host, routers[routername].baseport+links[link].locallink)) 
     listening[link].listen(backlog) 
     # append routes and listen-list 
     L.append(listening[link]) 
    except socket.error, (value,message): 
     print "Could not open socket: " + message 
     sys.exit(1) 

# run loop 
input = L 
running = 1 
while running: 
    inputready,outputready,exceptready = select.select(input,[],[], 0) 

    # Sockets loop 
    for s in inputready: 
     if s in L: 
      # handle the server socket 
      client, address = s.accept() 
      input.append(client) 
+0

(あなたがとにかく欲しいものsがある)しかし、唯一の選択他のデータ型で物事を複雑によりそうではなくリストを取り、リストに固執し、s代わりのLを参照...少し明確にすることはできますか? – Nate

+0

私は、具体的にどの部分を愛したいのですか、それともすべてを意味しますか? –

+0

2番目と3番目の文の解析に問題があります。 – Nate

答えて

0

最初の試みで私が間違っているかどうかは不明ですが、それ以来私は自分のジレンマを解決しました。 @ジェレミーは正しい軌道に乗っていましたが、(おそらく私の説明のせいで)ややオフでした。ソケットはsの外部で参照されないため、辞書である必要はありません。あなたの入門段落が私を混乱させる

L = [] 
input = [sys.stdin] 

for i in range(4): 
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    server.bind((host,port+i)) 
    server.listen(backlog) 
    L.append(server) 
    input.append(server) 

running = 1 
print len(L) 
while running: 
    inputready,outputready,exceptready = select.select(input,[],[]) 

    for s in inputready: 
     if s in L: 
      # handle the server socket 
      print "opened" 
      client, address = s.accept() 
      input.append(client) 
     elif s == sys.stdin: 
      # handle standard input 
      junk = sys.stdin.readline() 
      running = 0 
     else: 
      # handle all other sockets 
      data = s.recv(size) 
0

私はこの問題は、あなたが(入力)にアペンドクライアントソケットを追加したときにということだと思うことができます、また(L)に追加されます。これは、入力とLが両方とも同じリストオブジェクトを指しているために発生します。次に、新しく接続されたクライアントソケットがデータを送信すると、クライアントソケットでaccept()を呼び出そうとしますが、クライアントソケットはリスニングソケットではありません。 、とライン

input = L 

を置き換える修正するために

Jeremys-Mac-mini:python lcsuser1$ python 
Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> L = [1,2,3] 
>>> print L 
[1, 2, 3] 
>>> input = L 
>>> print input 
[1, 2, 3] 
>>> input.append(4) 
>>> print input 
[1, 2, 3, 4] 
>>> print L 
[1, 2, 3, 4] <-- d'oh! 

:input.append(クライアント)がLにクライアントを追加する理由の例として

は、ここに私のPythonインタプリタからの抜粋です

input = list(L) 

入力は、L自身を指すのではなく、Lのコピーを指すようにします。