Sending a struct over TCP

BCS ao at pathlink.com
Tue Mar 6 14:38:45 PST 2007


Reply to Benjamin,

> Reply to SirErugor,
> 
>> Hi there,
>> 
>> I've set up a server and a client application and I want to be able
>> to send a struct with fx. an integer and a char[]. So first I convert
>> it to a ubyte[] like this:
>> 
>> ..
>> void write(T)(T input)
>> {
>> buf ~= *(cast(ubyte[T.sizeof]*)&input)[0 .. T.sizeof];
>> }
>> Then I send the ubyte[] over through TCP via a SocketStream. On the
>> client-side I read and convert the ubyte[] back to the struct:
>> uint len = ss.read(buffer);
>> auto mem = new mem_stream(buffer[0 .. len]);
>> data d = mem.read!(data);
>> writefln("[id:%d] len=%d, data=%s (%d)", d.id, len, d.content,
>> d.content.sizeof);
>> Which outputs:    [id:100] len=12, data= (8)
>> The read function:
>> ..
>> int pos = 0;
>> ..
>> T read(T)()
>> {
>> T output = *(cast(T*)(buf[pos .. pos + T.sizeof].ptr));
>> pos += T.sizeof;
>> return output;
>> }
>> The Integer got sent perfectly (and i does the same with additional
>> ulongs etc.) but the char[] did not, though, it is still the same
>> size.
>> So why can't I send the char[]? is it because it is a array of
>> pointers to the address-space of the server?
>> 
>> Thank you in advance :)
>> 
>> (Btw. My files are also attatched)
>> 
> char[] is by reference. under the hood it is a pointer/length pair.
> 
> Somewhere I have a code generator that tries to make this work.
> 

ftp://ftp.novell.uidaho.edu/public_html/netidl_0_12_sdk.zip

somewhere in there is a template that will suck up arrays (and arrays of 
arrays, ...) and let you send them over the wire.

try running the program on a file like this

interface foo
{
  void bar(char[] i);
  void big(char[][] i);
}

I haven't looked at it for ages so I won't make any claims about how well 
it will work.




More information about the Digitalmars-d-learn mailing list