Как получить количество байтов в SendBuffer сокета? - PullRequest
0 голосов
/ 03 декабря 2011

У меня есть сетевое приложение, где возможно, что сервер недоступен. Каждые 30 секунд клиент отправляет в простое строку ping\n на сервер по TCP-соединению, чтобы сервер мог видеть, подключен клиент или нет. Мой сервер не отвечает вообще. Если соединение прерывается и клиент продолжает отправлять «ping» сообщения, пакеты будут храниться, возможно, операционной системой, в буфере до тех пор, пока сервер не получит пакеты. Если сервер снова подключен, возможно, сервер получит десятки пакетов ping одновременно. Можно ли получить количество байтов в этом буфере?

Edit: Как я могу получить количество байтов, которые должны быть отправлены клиентом?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2011

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

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

  • Одна вещь, на которую следует обратить внимание, это использовать Socket.setKeepAlive(true), который будет использовать механизмы TCP для сохранениярозетка жива.Я не уверен, насколько это надежно со стороны сервера, но он должен получить -1 из чтения, когда сокет истекает после того, как клиент уходит.
  • Другой способ - создать отдельное TCP-соединение длякаждый пинг.Если это слишком дорого, то вы можете восстановить соединение после определенного количества попыток проверки связи.
  • Третья вещь, которую следует учитывать, - это отправка UDP-пакетов от клиента, которые не будут буферизироваться и стоят намного дешевле.Вы должны отправлять чаще, поскольку также нет повторных попыток.
  • Сервер также может отправить какой-то ответ, чтобы клиент знал, что клиент знает, что сокет все еще исправен.Он может восстановить соединение, если не получит ответ.
0 голосов
/ 04 декабря 2011

Возможно ли получить количество байтов в этом буфере?

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

...