Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

I'm trying to send structs as neatly sorted packets using iPhone Game Kit..

I have a struct which looks like:

typedef struct {
   int coolStuff;
   char playerID[100];
} MyStruct;

Then I'm using strncpy() to copy the NSString I want into MyStruct.playerID. However, I would like to be able to send a playerID (string) of any size and possibly multiple strings per struct. Any suggestions?

There is a chance I'm making this more difficult than it actually is..

share|improve this question
add comment

2 Answers

Google's Protocol Buffers is a project designed to help with this kind of thing. Makes it somewhat easy to move structs around between memory, network, disk, et al.

share|improve this answer
    
Maybe I'm a little out of my element here.. but does this work with IPhone GameKit?.. I mistakenly left that out. Sorry! –  pleasedontlaugh Jul 28 '10 at 1:11
    
code.google.com/p/metasyntactic/wiki/ProtocolBuffers looks like it will do exactly that, but I can't say I've used it or had heard of it 5 minutes ago. –  coderanger Jul 28 '10 at 1:17
    
cool.. ill check this out. thanks! –  pleasedontlaugh Jul 28 '10 at 2:53
add comment

The fundamental thing you need to do is just have code on one side that knows how to serialize data, and code on the other that knows how to deserialize.

So, for variable length strings, just send the length first:

   n = strlen(playerid) + 1; // for NULL terminator
   sendto(server_sock,&n,sizeof(n),0,0,0);
   sendto(server_sock,playerid,n,0,0,0);

and then on the receiving side get the length, and read that many bytes.:

   int n;
   char *s;
   recvfrom(client_sock,&n,sizeof(n),0,0,0);
   s = malloc(n)
   recvfrom(client_sock,s,n,0,0,0)

Of course, what you should really do is gather up your communication into packets, and then send blocks of data at once with headers, have type info in a debug mode for safety, etc. but that's the gist of it.

Google protocol buffers look like they are a way of turning data into something serializable, so in that version of this example send and recv would be an XML string, which is great for general servers, but you may want more explicit control.

share|improve this answer
    
Protobufs are significantly more compact than XML, and have both a text (JSON-esque) and binary form. Otherwise, I agree, it's good to know how this stuff works under the hood. –  user744 Aug 31 '10 at 19:22
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.