Обнаружение изящных выключений сокетов в питоне - PullRequest
2 голосов
/ 06 июля 2011

Я пытаюсь определить, корректно ли был отключен сокет сервера в python.

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

Я знаю, что вашим первым предложением будет позволить клиенту отправить либо длину файла, либо некоторые завершающие данные, чтобы сервер знал, что передача файла завершена.
К сожалению, я не могу изменить клиента, он просто выдает дампфайл поверх raw tcp, и я ничего не могу с этим поделать.Поэтому, пожалуйста, не «но если бы вы могли изменить его» или «ваш протокол имеет недостатки», я не написал протокол и мне придется с ним иметь дело.

Скрипт должен работать как на OSX, так и на linuxИтак, epoll вышел.

Есть предложения?

Могу добавить, что мне все равно, какая ошибка возникает, просто что-то произошло.

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Если другой конец завершил отправку данных, они должны закрыть (2) сокет для записи.Тогда в вашем цикле мультиплексирования вы сможете проверить, был ли сокет отключен для записи или был просто закрыт (запись и чтение) удаленным концом.Это корректное завершение, и вы можете использовать select / poll / kqueue или что-либо еще.

Если клиент этого не делает, не отправляет завершающий символ и не отправляет длину или контрольную сумму, которую он смотритhard.

Вы должны опустить более подробную информацию о протоколе, открывает ли клиент сокет TCP для единственной цели отправки файла?Закрывает ли он сокет, если передача завершена?

В худшем случае вам придется проверить целостность файла, если вы знаете его формат, вы можете попробовать проверить его во время выполнения или получитьCron Tab сделать уборку.Если вы не можете, то будет сложно найти решение.Удачи ...

0 голосов
/ 06 июля 2011

Оказывается, все, что мне нужно было сделать, это установить тайм-аут сокета на более низкое значение, например, на 1 минуту, вызов recv сгенерирует исключение через 1 минуту.

...