LINUX.ORG.RU

Сколько времени (в мс) нужно для получения данных из сокета?

 ,


0

0

есть следующий набросок (используется на сервере)

При «выполнении» «last_action» нужно вернуть некий результат клиенту

while accepted_string = connection.gets
  json_object = JSON.parse(accepted_string)
  ...
  connection.puts(JSON.generate({'result' => 'blah'}))
  ...
  if json_object['action'] == 'last_action'
    break
  end
  ...
end
connection.close

Случай №1

  • На клиенте connection.close не делается.
  • есть if с проверкой «last_action» и connection.close после цикла в серверном коде (как в примере)

Случай №2

  • нету if с проверкой «last_action» и сответсвенно connection.close после цикла
  • На клиенте после получения ответа делается connection.close.

Примечание к №1: не уверен что можно так делать (не будет ли соединение будет закрыто перед тем, как ответ будет получен)

Статистика: для случая №1 время которое нужно для получения данных (connection.gets на клиенте) равно примерно 40мс. для случая №2 - примерно 80мс.

Вопрос: почему такая разница? это нормальное время? может есть более правильный способ делать все это?

Update: все происходит на локалхосте

★★★★★

Последнее исправление: ZuBB (всего исправлений: 2)

Also, I suggest you try setting <sockobj>.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) at both ends to turn off the Nagle algorithm

ZuBB ★★★★★
() автор топика

Примечание к №1: не уверен что можно так делать (не будет ли соединение будет закрыто перед тем, как ответ будет получен)

http://stackoverflow.com/questions/8874021/close-socket-directly-after-send-u...

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

Если сервер должен обрабатывать ошибки иначе, чем разрывая соединение, то можно воспользоваться советом по ссылке.

gv
()
Ответ на: комментарий от ZuBB

TCP_NODELAY

Да, и стоит заметить, что при включении TCP_NODELAY отвественность за правильную буферизацию
ложится на программиста, если важна производительность.

Что касается случая 2 — проверил на всякий случай.
На loopback у меня после вызова close() на стороне клиента сервер получает FIN через 2 микросекунды, без задержки.

gv
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.