[Tutor] packet parsing
Thu, 28 Feb 2002 14:53:26 -0600
I'm trying to make the best of my unemployed time and have decided that
implementing an SSH client in Python will keep me occupied for a few
I've just started, and am working on the first non-trivial part (which
appeared REALLY quickly in the IETF draft).
My program connects to the server; the server says, "I'm an SSH server".
My client says, "I'm an SSH client". The server then sends a variable
length message in SSH Binary Packet Format to initiate a key exchange.
My first question is: do I need to be concerned about
little/big/network-endian? Both of my machines are little-endian. So
when I look at a byte from the SSH server's packet, do I need to do a
network-to-host translation? Conversely, when I send a byte to the
server, do I need to do a host-to-network translation
My second question is: how do I look at/manipulate bytes of an incoming
network packet? Or bits even. Right now, I have the following piece of
code that receives the SSH server's initial key exchange packet:
kexrecv = mysock.recv(blocksize)
I want to directly manipulate the bits/bytes of kexrecv. Everything
that I've done makes kexrecv into a string. And I'm having problems
with kexrecv as a string -- I want to deal with it as a binary stream.
(Note: this might not be the best way to deal with it, but until I have
a good grip on the SSH transport protocol, it's how I prefer to deal
with it -- right now I want to be able to say: "read the first 32 bits,
convert it into a number; read the next 8 bits, convert it into a
number; read the next 128 bits...blah, blah, etc.).
type(kexrecv) results in <type 'str'>
type(`kexrecv`) results in <type 'str'>
len(kexrecv) returns nothing
len(`kexrecv`) returns 830
print len(kexrecv) returns 632
print len(`kexrecv`) returns 830
(Yes, I know that the backticks are equivalent to repr() -- I looked it
up on google last night). I want to deal with kexrecv and not
`kexrecv`. But I haven't been able to figure it out.
If kexrecv is a string [as type(kexrecv) seems to think] why doesn't
len(kexrecv) return anything? And if kexrecv is a string, why does
len(`kexrecv`) return a larger value than "print len(kexrecv)"?