Как вывести сервер сокетов из состояния «занято» после `kill PID`? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть простая настройка сокет-сервера для отправки некоторых номеров клиенту в интрасети.Во время тестирования я останавливаю скрипт server.py на терминале ( CTRL + C ), что позже приводит к ошибке занятого сервера в Safari при попытке доступа к той же странице.

Я видел этот вопрос о сбое сервера Но проблемы следующие:

  1. Я не смог найти файл /etc/init.d/networking restart.Я использую Mac, и это для Linux.Кроме того, это излишне, когда я тестирую свой сервер.По крайней мере, 10 раз в час.

  2. Вставка опции SO_REUSEADDR в коде помогла Address already in use, но я считаю, что мой сервер работает, но находится в состоянии занятости.Используя ответ здесь , я отредактировал код так:

host = <my machine address>  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
port = 8080
s.bind((host, port))

Какие изменения я делаю в своемсервер для удаления этой ошибки в Safari?

Safari не может открыть страницу «my-ip», поскольку сервер неожиданно оборвал соединение.Это иногда происходит, когда сервер занят.Подождите несколько минут, а затем повторите попытку.

Вывод lsof -i:8080, после остановки сценария было

python3.7 11881 <user>    3u  IPv4 <Device>   0t0  TCP <my machine address>?:http-alt (LISTEN)

Я сделал kill 11881, а затем повторно запустилкод, но получил то же сообщение в Safari.

Вывод netstat -na | grep "8080" был

tcp4       0      0  <my machine address>.8080     *.*    LISTEN    

во время работы скрипта и ничего, когда я KeyboardInterrupt.

Firefox на мгновение показывает страницу, а затем показывает страницу с ошибкой

Соединение было сброшено

Chrome показывает пустую страницутолько.

Обновление: Работает в python 2.7, но не в 3.5.Разница в коде заключается в:

c.send('\n')

в 2,7 и

c.send(bytes('\n'.encode('utf-8')))

в 3,5, где

c равно

c, (client_host, client_port) = s.accept()

Отдых все тот же.

1 Ответ

0 голосов
/ 30 июня 2019

Я случайно закомментировал строку

c.recv(1000)

Где в вопросе упоминается c.

Я нашел его, когда сравнил со старой версией того же файла.

...