Comments (1)
Alright I had to figure this out from source code.
The library internally uses the std::io::Read trait which provides no guarantees on whether the read will block or not. It depends on what you provide the constructor so you can make it blocking or non-blocking.
The return values took a bit to understand how it all works. Ok(None) can mean different things. If the internal call to read() provides only part of a parcel the method will return Ok(None) because it doesn't have enough data to fully construct the parcel yet. This means you need to call Ok(None) at least twice. This is further exasperated by the fact that the send_packet() method calls write twice, once for a size header and again for the parcel itself. This is annoying because write not buffered for TcpStream. That can manifest in the receive_packet reading the header data only, returning Ok(None) because it needs more data, then when you call receive_packet again it will be able to read the rest of the parcel and actually construct something to return an Ok(Some()). The library does not use EOF as a sign to return Err though because it pushes parcels into a queue to serve you as you call receive_packet. This happens when it gets multiple parcels worth of data with one call to read(). So in effect if you get multiple Ok(None) in a row that means either connection is EOF or you just need to keep waiting for data depending on blocking or not.
from protocol.
Related Issues (20)
- Support transmission of structs as name:value field pairs
- Support optionally-enabled middleware
- Where clauses ignored when deriving Protocol for traits that have where clauses
- Rust 2018 HOT 2
- Support for validation and size limiting
- Not possible to get discriminant of received packet? HOT 3
- Standardize naming convention of `discriminant` versus `discriminator`
- Does not work with non_blocking communication. HOT 1
- Support stable Rust HOT 1
- Support for uuid seams broken. HOT 3
- Null terminated strings HOT 1
- Variable protocol depending on context: Custom Settings or Hints.
- Fixed length
- remove panic on unknown discriminator HOT 1
- Stream connection panic wihle sending packet
- Crate Abandoned?
- Support array sizes over 32 HOT 8
- Use error-chain for error handling HOT 1
- Doesn't work at latest nightly rust toolchain HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from protocol.