действительно ли возможно узнать, находится ли рубиновый сокет в УСТАНОВЛЕННОМ состоянии или CLOSE_WAIT, на самом деле не отправляя или считывая данные?

Это хак, чтобы применять стили только к более старым версиям IE. * Объявленные стили будут переопределять новые элементы стиля, которые не поддерживаются только Od IE. http://en.wikipedia.org/wiki/CSS_filter#Star_hack

5
задан bjb568 15 May 2014 в 03:20
поделиться

1 ответ

Ответ зависит от реализации . Вам нужно будет проверить файлы заголовков реализации tcp в вашей ОС. Вот пример клиента для linux, который возвращает состояние сокета.

  ts = TCPSocket.new('localhost', 5777)
  ssl = OpenSSL::SSL::SSLSocket.new(ts, OpenSSL::SSL::SSLContext.new)
  ssl.sync = true
  ssl.connect
  # TCP_INFO is 11
  # note that TCP_INFO isn't defined in the ruby source.  
  # i had to look up the integer value in /usr/include/netinet/tcp.h
  optval = ts.getsockopt(Socket::SOL_TCP, 11) 
  state = optval.unpack "i" 
  puts "state: #{state}"

Вот структура tcp_info для моей последней версии ubuntu linux

struct tcp_info
{
  u_int8_t      tcpi_state;
  u_int8_t      tcpi_ca_state;
  u_int8_t      tcpi_retransmits;
  u_int8_t      tcpi_probes;
  u_int8_t      tcpi_backoff;
  u_int8_t      tcpi_options;
  u_int8_t      tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;

  u_int32_t     tcpi_rto;
  u_int32_t     tcpi_ato;
  u_int32_t     tcpi_snd_mss;
  u_int32_t     tcpi_rcv_mss;

  u_int32_t     tcpi_unacked;
  u_int32_t     tcpi_sacked;
  u_int32_t     tcpi_lost;
  u_int32_t     tcpi_retrans;
  u_int32_t     tcpi_fackets;

  /* Times. */
  u_int32_t     tcpi_last_data_sent;
  u_int32_t     tcpi_last_ack_sent;     /* Not remembered, sorry.  */
  u_int32_t     tcpi_last_data_recv;
  u_int32_t     tcpi_last_ack_recv;

  /* Metrics. */
  u_int32_t     tcpi_pmtu;
  u_int32_t     tcpi_rcv_ssthresh;
  u_int32_t     tcpi_rtt;
  u_int32_t     tcpi_rttvar;
  u_int32_t     tcpi_snd_ssthresh;
  u_int32_t     tcpi_snd_cwnd;
  u_int32_t     tcpi_advmss;
  u_int32_t     tcpi_reordering;

  u_int32_t     tcpi_rcv_rtt;
  u_int32_t     tcpi_rcv_space;

  u_int32_t     tcpi_total_retrans;
};

Вы можете заметить, что мой скрипт возвращает только целое число. Вот перечисление C, в котором подробно описаны состояния TCP и их целочисленные значения. Опять же, это было найдено в /usr/include/netinet/tcp.h[1226 identify. Кроме того, этот поток говорит, что вы можете обнаружить CLOSE_WAIT, прочитав EOF. Но поскольку вас беспокоит, были ли отправлены данные, вам, вероятно, придется распаковать до tcpi_last_data_sent.

Наконец, оговорка. Я взял на себя задачу ответить на ваш вопрос, потому что это звучало весело, и это было так, но мои C-ноги все еще шатаются, так что YMMV. :)

10
ответ дан 13 December 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: