2011-11-12 44 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本身。