Coding a server

Hey,

I'm porting some old c++ code for a server to ruby, and I can't figure
out what's the correct way of doing the network packet parsing

I'm using eventmachine for the networking code but when a packet is
received it must be parsed and depending on the header the packet will
have one format or another, and each of these would have an associated
reply format, I'm not quite sure on how to code this while keeping it
clean

Any ideas on how you would do this?
also, in cpp I'm using structs for the packet formats, but I have no
idea on how to do that in ruby

···

--
Posted via http://www.ruby-forum.com/.

Take a look at packetfu Google Code Archive - Long-term storage for Google Code Project Hosting.

enjoy,

-jeremy

···

On Mon, Jan 05, 2009 at 04:24:02PM +0900, Vernier -- wrote:

Hey,

I'm porting some old c++ code for a server to ruby, and I can't figure
out what's the correct way of doing the network packet parsing

I'm using eventmachine for the networking code but when a packet is
received it must be parsed and depending on the header the packet will
have one format or another, and each of these would have an associated
reply format, I'm not quite sure on how to code this while keeping it
clean

Any ideas on how you would do this?
also, in cpp I'm using structs for the packet formats, but I have no
idea on how to do that in ruby

--

Jeremy Hinegardner jeremy@hinegardner.org

Jeremy Hinegardner wrote:

···

On Mon, Jan 05, 2009 at 04:24:02PM +0900, Vernier -- wrote:

Any ideas on how you would do this?
also, in cpp I'm using structs for the packet formats, but I have no
idea on how to do that in ruby

Take a look at packetfu Google Code Archive - Long-term storage for Google Code Project Hosting.

enjoy,

-jeremy

the bindata dependency for packetfu is exactly what I was looking for
for the structs, thanks a lot
--
Posted via http://www.ruby-forum.com/\.

Vernier -- wrote:

Jeremy Hinegardner wrote:

Any ideas on how you would do this?
also, in cpp I'm using structs for the packet formats, but I have no
idea on how to do that in ruby

Take a look at packetfu Google Code Archive - Long-term storage for Google Code Project Hosting.

enjoy,

-jeremy

the bindata dependency for packetfu is exactly what I was looking for for the structs, thanks a lot

Another option:

http://redshift.sourceforge.net/bit-struct/

I don't know bindata, but from a quick glance at the docs I see that it does handle related fields, like length fields that specify the length of another field. BitStruct does *not* do that.

Another difference is that BitStruct is a subclass of string, so it is very efficient to send a bitstruct to a socket or file or perform other string operations.

···

On Mon, Jan 05, 2009 at 04:24:02PM +0900, Vernier -- wrote:

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Joel VanderWerf wrote:

Another option:

BitStruct

I don't know bindata, but from a quick glance at the docs I see that it
does handle related fields, like length fields that specify the length
of another field. BitStruct does *not* do that.

Another difference is that BitStruct is a subclass of string, so it is
very efficient to send a bitstruct to a socket or file or perform other
string operations.

amazing performance, for creating 10k instances of the same simple
struct (ruby 1.9 rc1):

             user system total real
bindata 3.681000 0.000000 3.681000 ( 3.827000)
bit-struct 0.063000 0.000000 0.063000 ( 0.057000)

so bit-struct is actually a good choice for networking without any
modifications

···

--
Posted via http://www.ruby-forum.com/\.

Vernier -- wrote:

Joel VanderWerf wrote:

Another option:

BitStruct

I don't know bindata, but from a quick glance at the docs I see that it
does handle related fields, like length fields that specify the length
of another field. BitStruct does *not* do that.

Another difference is that BitStruct is a subclass of string, so it is
very efficient to send a bitstruct to a socket or file or perform other
string operations.

amazing performance, for creating 10k instances of the same simple struct (ruby 1.9 rc1):

             user system total real
bindata 3.681000 0.000000 3.681000 ( 3.827000)
bit-struct 0.063000 0.000000 0.063000 ( 0.057000)

so bit-struct is actually a good choice for networking without any modifications

Exactly. If you have big packets, and only need to access a few fields (esp. fixed length), bit-struct is especially efficient. But if you want to use accessors a lot, then other libs might be better. With bit-struct, each field access may require pack/unpack, bit masking/shifting, etc.

···

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407