How to read TCP?
oilel opened this issue · comments
This example only shows to write a byte slice to stream, but how to read from the stream?
Is the written byte slice the response to TCP client?
TCP streams implement the Read
trait, which can be used to read from the stream.
TCP streams implement the
Read
trait, which can be used to read from the stream.
I sent the 2nd question below the question of how to read.
Assuming you have a stream already:
use async_std::prelude::*;
let mut bytes = [0u8; 32];
stream.read(&mut bytes).await?;
Replace read
with read_exact
if you want to fill up the bytes
array rather than read as much as possible in one go. See here
for more methods.
If I write b"hello world" to incoming TCP stream then use flush method for TCP stream, the browser tells me invalid HTTP response.
What's the difference between .read_to_end() and .poll_read()? .poll_read_vectored() and .poll_write_vectored() allows using multiple buffers, what's the use case of multiple buffers? @notgull
@notgull My program binded to address 127.0.0.1:1024, I used my browser to connect to this address, the content read from the stream was:
TcpStream { watcher: Async { source: Source { raw: 8, key: 2, state: Mutex { data: [Direction { tick: 0, ticks: None, waker: None, wakers: Slab { len: 0, cap: 0 } }, Direction { tick: 0, ticks: None, waker: None, wakers: Slab { len: 0, cap: 0 } }], poisoned: false, .. } }, io: Some(TcpStream { addr: 127.0.0.1:1024, peer: 127.0.0.1:46679, fd: 8 }) } } TcpStream { watcher: Async { source: Source { raw: 8, key: 2, state: Mutex { data: [Direction { tick: 0, ticks: None, waker: None, wakers: Slab { len: 0, cap: 0 } }, Direction { tick: 0, ticks: None, waker: None, wakers: Slab { len: 0, cap: 0 } }], poisoned: false, .. } }, io: Some(TcpStream { addr: 127.0.0.1:1024, peer: 127.0.0.1:46681, fd: 8 }) } } TcpStream { watcher: Async { source: Source { raw: 8, key: 2, state: Mutex { data: [Direction { tick: 0, ticks: None, waker: None, wakers: Slab { len: 0, cap: 0 } }, Direction { tick: 0, ticks: None, waker: None, wakers: Slab { len: 0, cap: 0 } }], poisoned: false, .. } }, io: Some(TcpStream { addr: 127.0.0.1:1024, peer: 127.0.0.1:46683, fd: 8 }) } }
If I write b"hello world" to incoming TCP stream then use flush method for TCP stream, the browser tells me invalid HTTP response.
This is because you're writing raw text instead of a valid HTTP response. You would need to write something like b"GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\nHello world!"
. However when it comes to HTTP you should generally use async-h1
or a web framework like tide
.
What's the difference between .read_to_end() and .poll_read()? .poll_read_vectored() and .poll_write_vectored() allows using multiple buffers, what's the use case of multiple buffers? @notgull
The main draw of vectored reads and writes is that it allows you to have multiple buffers split across memory for your read operation. An example use case would be in HTTP, if you wanted to read the header to one buffer and the body to another. See this page for more information.
This is because you're writing raw text instead of a valid HTTP response.
If I don't write anything at that time, the web browser may tell me socks not connected. Can it tell web browsers to wait for responses (maybe wait for 5 minutes) instead of showing error like socks not connected?