in reply to Socket Newbie (perl newbie, too...)
I think you're misunderstanding the packet format.
When you say that the representation is in "binary",
it doesn't mean the binary representation that you get
by doing unpack "B*"; it means that your data is packed
as if it's in a binary structure. So you have the right operator
(pack), you just have the wrong pack template.
I think that this will work for you:
That pack template ("CnCCNnn") says to pack the list of values (the rest of the arguments to pack) in the following way:my $data = "LOGON USERNAME=NAME PASSWORD=PASS\0"; my $packet = pack "CnCCNnn", 2, ## sync byte length($data)+13, ## message size 13, ## header size hex("4c"), ## message type 1, ## sequence ID 0, ## protocol ID 1; ## version number $packet .= $data;
- unsigned char value (1 byte)
- short in network order (2 bytes)
- unsigned char value (1 byte)
- unsigned char value (1 byte)
- long in network order (4 bytes)
- short in network order (2 bytes)
- short in network order (2 bytes)
Second, you can't just use 'pack "N"'; that packs everything as a network-order long, which is 4 bytes. You don't want everything to be 4 bytes; some things are 1 byte, some are 2, some are 4. You have to vary you pack template depending on that.
In Section
Seekers of Perl Wisdom