Функция выключения розеток Беркли, насколько важно? - PullRequest
2 голосов
/ 18 июня 2009

в качестве фона У меня есть встроенное устройство, которое общается со сторонним сервером по IP. Код на стороннем сервере вряд ли изменится. В недавнем выпуске я изменил функцию ip disconnect для вызова shutdown () перед вызовом close () (ранее она только что вызывала close ()). Встроенное устройство отключается без завершения сеанса связи, если происходят определенные прерывания. Когда это происходит в неправильной точке сеанса, сервер теперь создает файл трассировки, который по разным причинам неприемлем для клиента. Это происходит только при вызове shutdown, сервер обрабатывает это как ошибку отправки не удалось (и создает файл трассировки), в то время как более внезапное закрытие close () обрабатывает как ошибку с другим отключенным концом, которая не требует трассировки.

Итак, очевидное решение - перестать вызывать shutdown. Ответ г-на Барнса в этом вопросе дает хорошее описание двух функций, но, если вы знаете, что к конкретному сокету подключен только один процесс, есть ли какая-либо причина использовать shutdown до закрытия? *

Спасибо, Patrick

Ответы [ 2 ]

4 голосов
/ 18 июня 2009

Мне кажется, что «внезапное отключение» стало частью вашего протокола связи, что не очень хорошо. Если клиент работает долго после того, как «происходят определенные прерывания», чтобы решить, использовать ли shutdown() или close() или нет и повлиять ли это на то, что видит другой конец, было бы лучше обновить ваш протокол для надежной доставки « это сообщение прервано. "

Тем не менее, звучит так, как будто эта система (т. Е. Все взаимодействующее программное обеспечение) достаточно сильно зависла (на сервере) настолько, что такого рода изменения никогда не произойдут. Вероятно, вы хотите вместо того, чтобы выяснить, в чем действительно заключается проблема, попросить менеджера подписать быстрое и грязное решение «просто используйте close()», объяснив ему, что вы на самом деле не конечно, какие другие эффекты это могло бы иметь, но раньше все шло хорошо. (Вы не заметили, что другие ошибки исчезли с тех пор, как вы сделали это изменение?)

Решение о том, стоит ли искать потенциально дорогой поиск, чтобы увидеть, что на самом деле здесь происходит, наряду с потенциально дорогостоящим (политически, если не финансово) с какой-либо организацией на другом конце, ответственной за поддержание этого программного обеспечения, является действительно управленческим решением, не технический, хотя для правильного изготовления необходимо учитывать технические риски.

1 голос
/ 07 декабря 2010

Если вы знаете, что к определенному сокету подключен только один процесс, есть ли причина использовать shutdown перед закрытием?

Нет, нет.Вопреки большому количеству документации там.Close закрывает рукопожатие FIN / ACK, если оно еще не было отправлено.

РЕДАКТИРОВАТЬ: однако это не означает, что завершение работы не имеет смысла: конечно, это так.Если вы хотите прекратить отправку и хотите, чтобы получатель знал это, но хотите продолжать получать, это то, для чего это нужно.Другое использование - почти решить проблему с двумя армиями и получить синхронизированные закрытия: если вы читаете EOS, отправьте завершение работы и закройте;если вы хотите инициировать закрытие, отправьте завершение работы и прочитайте до EOS, а затем закройте.Если протокол вашего приложения верен, последний шаг не должен считывать какие-либо данные, и закрытие на обоих концах будет довольно одновременным.

...