
-----Original Message----- From: boost-users-bounces@lists.boost.org [mailto:boost-users- bounces@lists.boost.org] On Behalf Of Marsh Ray Sent: May-12-11 1:11 PM To: boost@lists.boost.org; boost-users@lists.boost.org Subject: [Boost-users] Delimiting protocol messages (was [asio] read_some() splits data)
On 05/11/2011 09:36 AM, Andrew Holden wrote:
On Wednesday, May 11, 2011 9:57 AM, Slav wrote:
Then messages of length not multiple of 128 (BUFFER_SIZE) will not be read - tested it, anyway, after last socket::read_some() (with readBytes> 0&& < BUFFER_SIZE) next socket::read_some() never ends.
It would probably help to understand that TCP has no concept of a "message". Anything you write to a socket is appended to a stream of *bytes*.
Alternatively, we could say that TCP, in fact, does have a well-defined concept of messages: they are all exactly one byte long.
Related to this, I wonder if there are any class libraries that facilitate processing these byte streams. I read, in the rationale part of the documentation for ASIO, the following: "Basis for further abstraction. The library should permit the development of other libraries that provide higher levels of abstraction. For example, implementations of commonly used protocols such as HTTP." It seems like such an obvious thing to do: to write a class library that contains classes that use the TCP capabilities of boost::asio to automagically take data read from the socket and do whatever is needed. For example, one might want to construct a series of http requests from the data coming in on port 443, and be able to relate the addressing data in the application layer to that in the TCP layer, and use that comparison to determine whether to forward the request to server A or server B. One reason for doing so would be for, for example, my own edification (and anyone else interested in learning) about how the different OSI layers work. Another would be for security purposes (e.g. to know whether or not an authorized user's session has been hijacked). It seems to me to be an obvious thing to do, but my question to you is "Do you know of anyone who has done it?" (in some kind of open source project) If not, do you know of resources available online where I could learn how to do it? I am finding it hard to find resources that are useful: I have well developed C++ skills, e.g. to write custom IO stream classes, but need some guidance on how to proceed with the 'further abstraction' the docs mention, and what the recommended best practices are specific to (high performance, secure) networking program development. You said, " I've done a little protocol stuff with ASIO now and I must say it's a lot of fun and I can't go back to doing it any other way." How did you get started on it? Did you use any documentation other than the asio docs? Do you know of any documents (ideally online) that show how you could use this stuff to thwart the major kinds of attacks that can be made on a web server? Thanks Ted