Python сокет словарь с выбором - PullRequest
1 голос
/ 12 ноября 2011

Почему-то я не могу сопоставить выбранные сокеты с моим словарем сокетов.Приведенный ниже код создает словарь сокетов (что делает), а затем, когда кто-то подключается принять (что не делает)Он находит 's' в 'L', но затем не может socket.error: [Errno 22] Invalid argument

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)

Ответы [ 2 ]

0 голосов
/ 17 ноября 2011

Хотя я не уверен во всех своих ошибках в первой попытке, с тех пор я решил свою собственную дилемму.@ Джереми был на правильном пути, но немного не в том (вероятно, из-за моего описания).На сокеты не ссылаются за пределами s, и поэтому они не должны быть словарём.Однако select выбирает только список, чтобы не усложнять ситуацию с другими типами данных, придерживайтесь списка и используйте ссылку s вместо L (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 голосов
/ 12 ноября 2011

Мне кажется, проблема в том, что когда вы добавляете клиентский сокет добавления в (вход), вы также добавляете его в (L). Это происходит потому, что input и L оба указывают на один и тот же объект списка. Затем, когда вновь подключенный клиентский сокет отправляет вам некоторые данные, вы пытаетесь вызвать accept () на клиентском сокете, но, конечно, клиентский сокет не является слушающим сокетом, поэтому вы получаете сообщение об ошибке. *

В качестве примера того, почему input.append (клиент) добавляет клиента в L, вот фрагмент из моего интерпретатора 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...