2011-11-12 40 views
1

出於某種原因,我無法將選擇套接字與我的套接字字典匹配。下面的代碼創建一個套接字字典(這是),然後當有人連接接受(它沒有)。它發現的'在「L」,但後來無法socket.error: [Errno 22] Invalid argumentPython插座字典與選擇

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

你的入門款有混淆了我......你能澄清一下嗎? – Nate

+0

我很想知道,哪一部分具體還是你的意思是整個事情? –

+0

我無法解析第二個和第三個句子。 – Nate

回答

0

儘管我第一次嘗試不能確定所有的錯誤,但自那以後,我解決了自己的困境。 @傑里米走在正確的軌道上,但略有偏差(可能是由於我的描述)。插座不在s之外被引用,因此不需要是字典。但是,(你想反正什麼s是)選擇只需要一個列表,這樣,而不是與其他數據類型複雜的東西,用一個列表堅持並引用s,而不是L

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.append(客戶端)將客戶端升的例子,這裏是從我的Python解釋器的代碼段:

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 = L 

input = list(L) 

因此,輸入指向L的副本,而不是指向L本身。