Эхо-сервер TCP никогда не отвечает, даже если я отправляю новую строку

Я пытаюсь следовать руководству по клиенту Tokio, чтобы написать клиент, который обращается к эхо-серверу, который отправляет ответ с новой строкой в ​​конце. Вот что у меня есть:

extern crate futures;
extern crate tokio_core;
extern crate tokio_io;

use std::net::SocketAddr;
use std::io::BufReader;
use futures::Future;
use tokio_core::reactor::Core;
use tokio_core::net::TcpStream;

fn main() {
    let mut core = Core::new().expect("Could not create event loop");
    let handle = core.handle();
    let addr: SocketAddr = "127.0.0.1:9999".parse().expect("Could not parse as SocketAddr");
    let socket = TcpStream::connect(&addr, &handle);
    let request = socket.and_then(|socket| {
        tokio_io::io::write_all(socket, &[65, 12])
    });
    let buf = vec![];
    let response = request.and_then(|(socket, _request)| {
        let sock = BufReader::new(socket);
        tokio_io::io::read_until(sock, b'\n', buf)
    });
    let (_socket, data) = core.run(response).unwrap();
    println!("{}", String::from_utf8_lossy(&data));
}

Я ожидаю, что это напечатает "A\n", так как ASCII-код для A - 65, а для новой строки - 12. Мой сервер использует netcat, используя эту команду

ncat -l 9999 --keep-open --exec "/bin/cat"

Это, кажется, зависает при запуске будущего ответа на ядре. Что мне здесь не хватает?

1 ответ

Решение

ASCII-код для A - 65, а для новой строки - 12

Нет, это не так:

 The decimal set:

   0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6 ack    7 bel
   8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14 so    15 si
  16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22 syn   23 etb
  24 can   25 em    26 sub   27 esc   28 fs    29 gs    30 rs    31 us
  32 sp    33  !    34  "    35  #    36  $    37  %    38  &    39  '
  40  (    41  )    42  *    43  +    44  ,    45  -    46  .    47  /
  48  0    49  1    50  2    51  3    52  4    53  5    54  6    55  7
  56  8    57  9    58  :    59  ;    60  <    61  =    62  >    63  ?
  64  @    65  A    66  B    67  C    68  D    69  E    70  F    71  G
  72  H    73  I    74  J    75  K    76  L    77  M    78  N    79  O
  80  P    81  Q    82  R    83  S    84  T    85  U    86  V    87  W
  88  X    89  Y    90  Z    91  [    92  \    93  ]    94  ^    95  _
  96  `    97  a    98  b    99  c   100  d   101  e   102  f   103  g
 104  h   105  i   106  j   107  k   108  l   109  m   110  n   111  o
 112  p   113  q   114  r   115  s   116  t   117  u   118  v   119  w
 120  x   121  y   122  z   123  {   124  |   125  }   126  ~   127 del

А 65, но перевод строки 10.

Тем не менее, нет никаких оснований использовать десятичные значения здесь, в первую очередь. Вместо этого используйте байтовый литерал:

tokio_io::io::write_all(socket, b"A\n")
Другие вопросы по тегам