Найти - Пользователи
Полная версия: Вопрос по Sockets
Начало » Python для новичков » Вопрос по Sockets
1
makzzz
Добрый день, пишу простецкий мессенджер и всё, в принципе, готово, но при тестировании на нескольких устройствах сразу вышла ошибка.
Серверная часть выглядит следующим образом - центральный скрипт генерирует несколько подпроцессов с разными портами для ожидания клиентов.

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

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

makzzz
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
py.user.next
  
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()
makzzz
Гениально! Я не думал, что сокет можно закрыть после подключения. Всё работает отлично! Благодарю!
py.user.next
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB