Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 2, 2016 06:24:36

makzzz
Зарегистрирован: 2016-09-02
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по Sockets

Добрый день, пишу простецкий мессенджер и всё, в принципе, готово, но при тестировании на нескольких устройствах сразу вышла ошибка.
Серверная часть выглядит следующим образом - центральный скрипт генерирует несколько подпроцессов с разными портами для ожидания клиентов.

sock = socket.socket()
sock.bind(('', sock_port))
sock.listen(0)
conn, address = sock.accept()

ошибка состоит в том, что несмотря на нулевую очередь (пробовал ставить 1, без разницы), второй клиент тоже подключается к уже занятому порту, а третий - уже кикается и подключается к следующему свободному. пробовал ставить
sock.setblocking(0)
абсолютно такое же поведение. Опыта программирования у меня совсем мало и базы нет, и я бы понял что упускаю что-то важное - если бы все клиенты могли подключиться к занятому порту, но нет. второй залипает и пытается передать сообщение, а третий - уже отбрасывается. Куда рыть? Клиенты на андроиде.
Заранее спасибо!

Офлайн

#2 Сен. 2, 2016 11:39:58

makzzz
Зарегистрирован: 2016-09-02
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по Sockets

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

Офлайн

#3 Сен. 3, 2016 10:12:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9992
Репутация: +  857  -
Профиль   Отправить e-mail  

Вопрос по Sockets

  
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)

Офлайн

#4 Сен. 5, 2016 05:29:04

makzzz
Зарегистрирован: 2016-09-02
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по Sockets

Гениально! Я не думал, что сокет можно закрыть после подключения. Всё работает отлично! Благодарю!

py.user.next

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version