Форум сайта python.su
Добрый день, пишу простецкий мессенджер и всё, в принципе, готово, но при тестировании на нескольких устройствах сразу вышла ошибка.
Серверная часть выглядит следующим образом - центральный скрипт генерирует несколько подпроцессов с разными портами для ожидания клиентов.
sock = socket.socket()
sock.bind(('', sock_port))
sock.listen(0)
conn, address = sock.accept()
ошибка состоит в том, что несмотря на нулевую очередь (пробовал ставить 1, без разницы), второй клиент тоже подключается к уже занятому порту, а третий - уже кикается и подключается к следующему свободному. пробовал ставить
sock.setblocking(0)
абсолютно такое же поведение. Опыта программирования у меня совсем мало и базы нет, и я бы понял что упускаю что-то важное - если бы все клиенты могли подключиться к занятому порту, но нет. второй залипает и пытается передать сообщение, а третий - уже отбрасывается. Куда рыть? Клиенты на андроиде.
Заранее спасибо!
Офлайн
netstat показывает конкретную вещь: создаётся ещё один лишний сокет
TCP 62.231.161.###:25901 62.231.174.###:44754 ESTABLISHED
TCP 62.231.161.###:25901 151.237.175.###:34189 ESTABLISHED
TCP 62.231.161.###:25902 151.237.168.###:52830 ESTABLISHED
Офлайн
import socket def f(): HOST = '' PORT = 50007 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(0) print('Start server on', PORT) conn, addr = s.accept() s.close() print('Connected by', addr) while True: data = conn.recv(1024) if not data: break conn.sendall(data) conn.close() while True: f()
Отредактировано py.user.next (Сен. 3, 2016 10:12:49)
Офлайн
Гениально! Я не думал, что сокет можно закрыть после подключения. Всё работает отлично! Благодарю!
py.user.next
Офлайн