parsing packets

L

Littlefield, Tyler

Hello all:
I'm working on a server that will need to parse packets sent from a
client, and construct it's own packets.
The setup is something like this: the first two bytes is the type of the
packet.
So, lets say we have a packet set to connect. There are two types of
connect packet: a auth packet and a connect packet.
The connect packet then has two bytes with the type, another byte that
notes that it is a connect packet, and 4 bytes that contains the version
of the client.
The auth packet has the two bytes that tells what packet it is, one byte
denoting that it is an auth packet, then the username, a NULL character,
and a password and a NULL character.

With all of this said, I'm kind of curious how I would 1) parse out
something like this (I am using twisted, so it'll just be passed to my
Receive function), and how I get the length of the packet with multiple
NULL values. I'm also looking to build a packet and send it back out, is
there something that will allow me to designate two bytes, set
individual bits, then put it altogether in a packet to be sent out?

--

Take care,
Ty
my website:
http://tds-solutions.net
my blog:
http://tds-solutions.net/blog
skype: st8amnd127
My programs don't have bugs; they're randomly added features!
 
T

Thomas Rachel

Am 10.07.2011 22:59 schrieb Littlefield, Tyler:
Hello all:
I'm working on a server that will need to parse packets sent from a
client, and construct it's own packets.

Are these packets sent as separate UDP packets or embedded in a TCP
stream? In the first case, you already have packets and only have to
parse them. In a stream, you first have to split them up.

In the following, I will talk about UDP datagrams. For TCP, further work
is needed.

The setup is something like this: the first two bytes is the type of the
packet.

Then you have

type = struct.unpack(">H", packet),
payload1 = packet[2:]
So, lets say we have a packet set to connect. There are two types of
connect packet: a auth packet and a connect packet.
The connect packet then has two bytes with the type, another byte that
notes that it is a connect packet, and 4 bytes that contains the version
of the client.

if type == CONNECT:
subtype = struct.unpack("B", payload1)
payload2 = payload1[1:]
if subtype == CONNECT:
upx = payload2.split("\0")
assert len(upx) == 3 and upx[-1] == ''
username, password = upx[:2]
else:
assert len(payload2) == 4
version = struct.unpack(">L", payload2)

The auth packet has the two bytes that tells what packet it is, one byte
denoting that it is an auth packet, then the username, a NULL character,
and a password and a NULL character.

With all of this said, I'm kind of curious how I would 1) parse out
something like this (I am using twisted, so it'll just be passed to my
Receive function),

I. e., you already have your packets distinct? That's fine.
and how I get the length of the packet with multiple NULL values.

With len(), how else?

I'm also looking to build a packet and send it back out, is
there something that will allow me to designate two bytes, set
individual bits, then put it altogether in a packet to be sent out?

The same: with struct.pack().


Thomas
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,981
Messages
2,570,188
Members
46,733
Latest member
LonaMonzon

Latest Threads

Top