Could anyone help me in the question, thanks?


#1

In network application, we need to fill some fields of protocol header
like below (in C):

struct hdr {
unsinged short ver;
unsinged char len;
unsinged char flg;

};

int main(void)
{
struct hdr hh;
hh.ver = 0x1;
hh.len = 0x2;
hh.flg = 0x3;

send(sock, &hh, sizeof(hh), 0);

}

How could I do above in Ruby because I don’t find how to specify the
data type of variables or the address of variables in Ruby so far? I
will deeply appreciate if anyone gives me any hint about it? Thanks a
lot.


#2

Sonn Y. wrote:

int main(void)
How could I do above in Ruby because I don’t find how to specify the
data type of variables or the address of variables in Ruby so far? I
will deeply appreciate if anyone gives me any hint about it? Thanks a
lot.

You only need to worry about the types at the
serialisation/deserialisation interface, and you can do that with
Array#pack and String#unpack. There’s also bitstruct at
http://raa.ruby-lang.org/project/bit-struct/ if your needs are more
complicated.


#3

Alex Y. wrote:

Sonn Y. wrote:

int main(void)
How could I do above in Ruby because I don’t find how to specify the
data type of variables or the address of variables in Ruby so far? I
will deeply appreciate if anyone gives me any hint about it? Thanks a
lot.

You only need to worry about the types at the
serialisation/deserialisation interface, and you can do that with
Array#pack and String#unpack. There’s also bitstruct at
http://raa.ruby-lang.org/project/bit-struct/ if your needs are more
complicated.

Thanks a lot!


#4

Sonn Y. removed_email_address@domain.invalid writes:

How could I do above in Ruby because I don’t find how to specify the
data type of variables or the address of variables in Ruby so far? I
will deeply appreciate if anyone gives me any hint about it? Thanks a
lot.

This is exactly the problem that Array.pack was designed to solve.
Quoting from a recent post of mine dealing with network headers in the
FSP protocol: (ruby-talk:256654)

fsp_string = [fsp_pkt.cmd, 0, fsp_pkt.key,
fsp_pkt.seq, fsp_pkt.len, fsp_pkt.pos].pack(“CCnnnN”)

Basically, make an array containing what you need, then use pack to
stuff it into a byte string with the proper width and alignment. Then
write that byte string to your socket.