Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to read TCP? #1054

Open
oilel opened this issue Jan 25, 2023 · 10 comments
Open

How to read TCP? #1054

oilel opened this issue Jan 25, 2023 · 10 comments

Comments

@oilel
Copy link

oilel commented Jan 25, 2023

This example only shows to write a byte slice to stream, but how to read from the stream?

@oilel
Copy link
Author

oilel commented Jan 25, 2023

Is the written byte slice the response to TCP client?

@notgull
Copy link
Contributor

notgull commented Jan 25, 2023

TCP streams implement the Read trait, which can be used to read from the stream.

@oilel
Copy link
Author

oilel commented Jan 26, 2023

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.

@notgull
Copy link
Contributor

notgull commented Jan 26, 2023

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.

@oilel
Copy link
Author

oilel commented Jan 26, 2023

If I write b"hello world" to incoming TCP stream then use flush method for TCP stream, the browser tells me invalid HTTP response.

@oilel
Copy link
Author

oilel commented Jan 26, 2023

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

@oilel
Copy link
Author

oilel commented Jan 26, 2023

@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 }) } }

@notgull
Copy link
Contributor

notgull commented Jan 26, 2023

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.

@oilel
Copy link
Author

oilel commented Jan 27, 2023

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?

@artshell
Copy link

@oilel

I have the same problems!

// read and ignored
let mut buffer = [0; 1024];
stream.read(&mut buffer).await;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants