Sir DrinksCoffeeALot
Sir DrinksCoffeeALot

Reputation: 633

Copying structure to char* buffer

Basicly i have a custom structure that contains different kind of data. For example:

typedef struct example_structure{
uint8_t* example_1[4];
int example_2[4];
int example_3;
} example_structure;

What i need to do is to copy context of this structure to a const char* buffer so i can send that copied data (buffer) using winsock2's send(SOCKET s, const char* buffer, int len, int flags) function. I tried using memcpy() but wouldn't i just copy address of pointers and not the data?

Upvotes: 0

Views: 659

Answers (4)

Serge Ballesta
Serge Ballesta

Reputation: 148900

Hmm, your struct contains uint8_t * fields, what looks like C strings... It does not make sense copying or sending a pointer which is just a mere memory address in sending process user space.

If your struct has been (note, no pointers):

typedef struct example_structure{
uint8_t example_1[4];
int example_2[4];
int example_3;
} example_structure;

and provided you transfer it on exactly same architecture (same hardware, same compiler, same compiler options), you could do simply:

example_structure ex_struc;
// initialize the struct
...
send(s, &ex_struc, sizeof(ex_struc), flags);

And even in that case, I would strongly advise you to define and use a protocol - as already said by @DavidSchwartz, it could save you time and headaches later...

But as you have pointers, you cannot do that and must define a protocol.

it could be (but you are free to prefere little endian order, or 2 or 8 bytes for each int depending on your actual data):

  • one byte (or two) for length of first uint8_t array, followed by the array
  • above repeated 3 more times
  • four bytes in big endian order for first int of example_2
  • repeated 3 times
  • four bytes in big endian order for int of example_3

This clearly defines the format of a message.

Upvotes: 0

ly000
ly000

Reputation: 363

const char* buffer

This buffer has a constant value so u cant copy anything to it. You probably don't need to copy anything. Just use send function in such a way:

send(s, (char*)&example_structure, sizeof(structure), flags)

But here is the problem with pointers in your structure (uint8_t* example_1[4];). Sending pointers between different applications / machine does not make sense.

Upvotes: 0

dreamlax
dreamlax

Reputation: 95335

Yes, if you copied or sent that structure through a socket you would end up copying/sending pointers, which would obviously be meaningless to the recipient, however, if the recipient is running on different hardware (e.g. not the same endian), all of the data may be meaningless anyway. On top of that, differences in the amount of padding between structure members may also become a problem.

For non-trivial situations it is best to use an existing protocol (such as protobuf), or roll your own protocol, keeping in mind the potential differences in hardware representation of your data.

Upvotes: 1

David Schwartz
David Schwartz

Reputation: 182761

You need to design a protocol before you can encode the data in accord with that protocol. Decide exactly how the data will be encoded at the byte level. Then write code to encode and decode to that format that you decided on.

Do not skip the step of actually documenting the wire protocol at the byte level. It will save you pain later, I promise.

See this answer for a bit more detail.

Upvotes: 0

Related Questions