即使我发送换行符,TCP回显服务器也不会回复

时间:2017-12-20 00:08:24

标签: rust rust-tokio

我正在尝试按照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”,因为A的ASCII码是65,换行符是12.我的服务器是使用此命令的netcat

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

这似乎依赖于在核心上运行未来的响应。我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

  

A的ASCII码为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

A是65,但换行符 10

也就是说,首先没有理由在这里使用小数值。相反,使用字节文字:

tokio_io::io::write_all(socket, b"A\n")