Эхо-сервер 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")