Как получить доступ к информации о сети из TCP? - PullRequest
0 голосов
/ 08 марта 2020

Я пишу протокол прикладного уровня в Java. В основном это просто передача файлов. Я хотел бы генерировать сообщения об ошибках, если передача не может быть завершена или если соединение между клиентом и сервером прерывается.

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

1 Ответ

0 голосов
/ 08 марта 2020

TCP не знает о «статусе» перевода. Это проблема протокола приложения, а не проблема транспортного уровня.

Что касается состояния соединения TCP, то нет прямого запроса. Вместо этого вы узнаете статус при попытке чтения или записи данных. Результат read(...) или `write (...) для получения некоторой информации о состоянии соединения.

  • Если вызов read или write указывает, что он имеет читать или записывать ненулевое число байтов, тогда соединение, вероятно, живо.

  • Если read, который возвращает ноль байтов, указывает, что другой конец закрыл свою сторону записи связь. Однако мы не можем сказать, выполняло ли это удаленное приложение, это сделала удаленная ОС или что-то в сети инициировало закрытие.

  • Если read или write выдает исключение, тогда мы можем сделать вывод, что возникла проблема И соединение больше не является жизнеспособным. Исключения, которые возможны в этом контексте, включают:

    • SocketException - Типичные сообщения «сброс соединения» или «обрыв канала», которые обычно означают, что удаленный абонент сделал что-то неожиданное, или «закрытие сокета», что означает что приложение попыталось прочитать или записать соединение, которое оно закрыло.
    • SocketTimeoutException - Обычно это происходит, если read заняло больше времени, чем настроенное время ожидания чтения для розетки. К сожалению, он не может ничего вам сказать о базовой причине для тайм-аута.
    • ProtocolException - Теоретически это возможно для операции ввода-вывода через сокет, но обычно выдается это исключение по коду протокола приложения.

К сожалению, это означает, что предоставление пользователю вашего приложения четкой и точной информации о том, почему передача не удалась, затруднено. Но это присуще сетевым подключениям. Реальная проблема заключается в том, что простая / понятная диагностика c информации не доступна напрямую нигде .

...