kiran
kiran

Reputation: 525

python concatenate ctype struct and array

I am trying to implement a custom UDP protocol. This protocol has a header and data. The header has information about the structure of the data.

The header is defined using a ctypes struct and the data using 'h' array(signed short).

I am using python sockets.

I tried sending the header ans data using separate calls to "socket.sendto" like this:

s.sendto(header, addr)
s.sendto(data, addr)

But I am not able to receive this as a continuous stream. "socket.recvfrom" is only fetching the header. Maybe if I call "socket.recvfrom" again I will get the data as well. But thats not what I need. I need the full packet as a stream. I think concatenating the header and data in the server itself might fix this.

So I tried different combinations of the following to concatenate the two:

All the above failed for one reason or the other.

If I need to convert either header or data, I would prefer it to be the header as it is smaller. But if there is no way around, I am ok with converting the data.

Would appreciate any help.

Relevant code snippets:

sdata = array("h")
.
.
.
header=protocol.HEADER(1,50,1,50,1,50,1,50,1,10,1,12,1,1,1,1,1,18,19,10,35,60,85,24,25)
.
.
s.sendto(header+sdata, addr)

Upvotes: 0

Views: 2238

Answers (1)

Alex Martelli
Alex Martelli

Reputation: 881477

You can copy the header struct into a ctypes array of bytes:

>>> buf = (ctypes.c_char * ctypes.sizeof(header)).from_buffer_copy(header)

Now, in Python 2,

>>> buf.raw + sdata.tostring()

should give you what you're looking for.

In Python 3, it would be

>>> buf.raw + sdata.tobytes()

Upvotes: 1

Related Questions