Параметры сокета Python UDP для нескольких и одновременных клиентов - PullRequest
1 голос
/ 10 января 2010

Позвольте мне немного объяснить, какое приложение я делаю.

Я создаю центральный сервер UDP (должен быть UDP) для нескольких и одновременных клиентов, которые также «общаются» между ними. Я делаю проверку на наличие адресов известных клиентов и создаю поток обработчика клиента, если «я не знаю» клиента. Иначе, поток получает данные, которые делают свою работу. Новый поток получает ссылку на сокет и адрес вызывающего, поэтому они используют socket.sendTo с этим адресом и данными.

Проблема возникает, когда клиент закрывает своего клиента (Alt + F4), и кто-то говорит с ними, потому что сокет выдает ошибку 10054 «Сброс соединения сокета». Я думаю, не ожидается в UDP. Метод talk в клиентских потоках также находится между тегами try & кроме, но все же является UDP-сервером «recvfrom», который вызывает исключение.

Я использую Python 2.5 (нужен код) и параметры сокета:

host = "0.0.0.0"
port = 10000

UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
UDPSock.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
UDPSock.bind((host,port))

Есть несколько опций, которые позволяют мне делать то, что я хотел, или библиотека, которая решает эти проблемы?.

Или, если я делаю это неправильно ... есть способ сделать / эмулировать то же поведение, что и многопоточный TCP-сокет (создать новый поток обработчика клиента при принятии), но с UDP?

Спасибо за чтение;)

1 Ответ

1 голос
/ 10 января 2010

«Сброс сокета» происходит потому, что клиент отправил недоступный порт ICMP в ответ на дейтаграмму, отправленную в сокет, которого там больше не было.Совершенно разумный способ выразить это в API, так что вам просто придется справиться с этим.Но если вы просто игнорируете исключение, сокет все равно должен работать.

...