2011-11-12 2 views
1

어떤 이유인지 나는 소켓의 사전에 선택된 소켓을 일치시킬 수 없습니다. 아래의 코드는 누군가가 accept를 연결했을 때 소켓의 사전을 만든다. 그것은 socket.error: [Errno 22] Invalid argumentSelect with 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

두 번째 및 세 번째 문장을 파싱하는 데 문제가 있습니다. – 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

나는 문제가 당신이 (입력)에 APPEND 클라이언트 소켓을 추가 할 때, 당신은 또한 (L)에 추가되는 것을 생각 할 수없는 다음 '의'L '에서 발견,하지만. 이것은 입력 W가 모두 같은 목록 오브젝트를 가리키기 때.에 _ 생합니다. 그런 다음 새로 연결된 클라이언트 소켓이 데이터를 보내면 클라이언트 소켓에서 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에 클라이언트를 추가하는 이유의 예로서

, 여기 내 파이썬 인터프리터에서 미리보기입니다

input = list(L) 

입력이 L 자체를 가리 키지 않고 L 사본을 가리 키도록합니다.