Как отключить клиента от сервера python
Перейти к содержимому

Как отключить клиента от сервера python

  • автор:

Python закрыть TCP-соединение

У меня есть python tcp server, есть поток для каждого подключения для прослушивания. Когда я вызываю close в случае исключения объекта подключения, генерируется «bad file descriptor». По googling я нашел несколько решений, каждый из которых использует цикл, чтобы получать данные клиента и прерывать этот цикл, когда они решают отключить клиент. Мой клиент написан на С# и не «получает», что он «отключен» от сервера, python просто игнорирует входящие данные от клиента С#. Какой законный, лучший способ отключить tcp-соединение с серверной стороны в python?

2 ответа

Плохой файловый дескриптор, скорее всего, означает, что сокет уже закрыт другим потоком.

Вот некоторые мысли об общих практиках. Для клиента один способ узнать, что он отключен, — проверить, является ли значение recv() равным 0. Если это так, это означает, что удаленная сторона закрыла соединение. В принципе, вы должны использовать select (или poll) и передавать fds всех клиентов и сервера для выбора. Если вы получаете событие чтения на любом из fds, то в зависимости от типа fd, вот что происходит. Если fd — тип сервера, то событие чтения означает, что существует ожидающее соединение, и вы должны отправить accept(), чтобы получить новое соединение. С другой стороны, если hte fd не является типом сервера (что означает регулярное соединение tcp), то событие чтения означает, что есть некоторые данные, и вы должны выдать событие recv() для чтения данных.

Вы должны использовать цикл для выбора. В принципе, запустите цикл, используя вызов select(), и как только вы получите событие, сделайте что-то с этим событием, а затем повторно запустите цикл и выпустите следующий select(). Вы можете найти эти ссылки полезными: http://ilab.cs.byu.edu/python/select/echoserver.html и http://docs.python.org/2/library/socket.html

Примечание. close() освобождает ресурс, связанный с соединением, но не обязательно немедленно закрывает соединение. Если ты хочешь своевременно закрыть соединение, завершить вызов() до закрыть().

Итак, вы должны позвонить shutdown() перед вызовом close() . Также вы должны передать флаг SHUT_RDWR , чтобы полностью отключить соединение:

Ошибка «плохого описания файла» означает (скорее всего), что сокет уже закрыт (по крайней мере, со стороны Python).

Как отключить клиента от сервера сокетов без сбоя сервера?

Я делаю сервер на Python 3.7. Его цель — подключить к нему несколько человек (в настоящее время — один клиент для тестирования) и отправлять данные туда и обратно. Отправляемые данные — это рекорд пользователя в моей игре. Я хочу, чтобы сервер получил данные, сравнил данные с наивысшей оценкой, а затем отправил данные обратно и компьютер сохранил их в файл. Дело в том, что клиент получает текстовые данные как 0 и 1! А при выходе из игры и попытке переподключить сервер вылетает с:

[python] как правильно закрыть сокет

Есть клиент и есть сервер, написаны через модуль socket. Сервер в беск. цикле ждет соединения (socket.accept(. )).

Нужно в ОДНОМ скрипте bash запустить сервер, запустить клиента (тот стучится на сервер чего то делает и отваливается), потом грохнуть сервер так, что бы он отдал порт.

Запускаем сервер в фоне, запускаем клиента. валим сервер killall-ом. дальше начинается кино. Деструктор объекта сокет не отрабатывает, порт висит занятым еще сек 10-20, пока не стухнет по таймату (видимо). При попытке послать сигнал 2 (аналог Ctrl-C) ничего не происходит, сервер его тупо игнорирует (нет консоли что ли)? На все остальные сигналы тоже в обще плюет, кроме 9 и 15. Попытка явно повесить что то внятное на какой сигнал ни к чему не приводят — если вешаем метод close или shutdown вылетает сообщение

socket.error: (4, ‘Interrupted system call’)

и порт все равно остается занятым, если вешаем sys.exit() ничего не вылетает но порт все равно занят.

В общем вопрос — как корректно прибить снаружи сокет, который висит на методе accept? С консоли это делается Ctrl-C, но тут похоже он консоли то не видит.

Пока что я в баше сначала тупо жду освобождения порта, но это мягко говоря неудобно.

Как проверить на подключение клиента по socket python?

Всем привет!
Делаю сокет сервер на python.
Свою программу скидывать не буду, так как лишнего много, возьму простейшую программу.

Если я хочу установить сокет который длится бесконечно, при чем сервер как слушает, так и говорит.
Непонятки в том, что клиент может оборваться без предварительного сообщения. Как тогда отключить клиента от сокета на стороне сервера. Ведь если клиент отключился, а я не удалил его с сервера, то когда он будет подключаться снова conn, addr = sock.accept() выполняться не будет и программа зависнет. Как проверять, активен ли socket клиент или нет

  • Вопрос задан более трёх лет назад
  • 4100 просмотров
  • Facebook
  • Вконтакте
  • Twitter

Zarom

Вы уверены, что зависнет? Вроде бы не должно быть таких ограничений — 1 клиент 1 сокет.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *