kuntilanak
asked on
ntohl and htonl
In my assignment I am going to send structs over the UDP datagram.. the spec says that everything is in network byte order..
one example of the struct is the following.
So before sending the struct to the other machine, which is a 64 bit machine... what should I do? Should I call htonl?? as I've tried that and the other machine receives the status of the structs differently
one example of the struct is the following.
So before sending the struct to the other machine, which is a 64 bit machine... what should I do? Should I call htonl?? as I've tried that and the other machine receives the status of the structs differently
typedef struct AARP_Packet {
u_char version; // AARP_VERSION
u_char operation; // See below
AIP_Addr aip; // AIP address
struct in_addr ip; // IP address
in_port_t port; // Port
u_short status; // See below
} AARP_Packet;
AARP_Packet* temp = malloc(sizeof(AARP_Packet));
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
>> how can I make sure the u_short is a 32 bit unsigned integer type??
Did you define it to be a 32bit unsigned integer type ?
How is it defined ?
>> yes, I think the struct is not padded..
If you're not sure, you can't rely on it. The compiler is free to add padding if it thinks that's useful. Some compilers have switches to force it not to add padding.
>> Is the code below correct?
All depends on your struct layout, and the element sizes.
Can you post what the output of this code is for both platforms :
Did you define it to be a 32bit unsigned integer type ?
How is it defined ?
>> yes, I think the struct is not padded..
If you're not sure, you can't rely on it. The compiler is free to add padding if it thinks that's useful. Some compilers have switches to force it not to add padding.
>> Is the code below correct?
All depends on your struct layout, and the element sizes.
Can you post what the output of this code is for both platforms :
#include <stddef.h>
fprintf(stdout, "sizeof(u_char) = %u\n", sizeof(u_char));
fprintf(stdout, "sizeof(AIP_Addr) = %u\n", sizeof(AIP_Addr));
fprintf(stdout, "sizeof(struct in_addr) = %u\n", sizeof(struct in_addr));
fprintf(stdout, "sizeof(in_port_t) = %u\n", sizeof(in_port_t));
fprintf(stdout, "sizeof(u_short) = %u\n", sizeof(u_short));
fprintf(stdout, "sizeof(AARP_Packet) = %u\n", sizeof(AARP_Packet));
fprintf(stdout, "offsetof(AARP_Packet, version) = %u\n", offsetof(AARP_Packet, version));
fprintf(stdout, "offsetof(AARP_Packet, operation) = %u\n", offsetof(AARP_Packet, operation));
fprintf(stdout, "offsetof(AARP_Packet, aip) = %u\n", offsetof(AARP_Packet, aip));
fprintf(stdout, "offsetof(AARP_Packet, ip) = %u\n", offsetof(AARP_Packet, ip));
fprintf(stdout, "offsetof(AARP_Packet, port) = %u\n", offsetof(AARP_Packet, port));
fprintf(stdout, "offsetof(AARP_Packet, status) = %u\n", offsetof(AARP_Packet, status));
ASKER
This is what I got on the 32 bit machine and I can't test it on the 64 bit machine, but it can always be assumed to parse it correctly as it's given as a part of the assignment in binary...
sizeof(u_char) = 1
sizeof(AIP_Addr) = 2
sizeof(struct in_addr) = 4
sizeof(in_port_t) = 2
sizeof(u_short) = 2
sizeof(AARP_Packet) = 12
>> but it can always be assumed to parse it correctly as it's given as a part of the assignment in binary...
Ok.
Then you'll need to show a bit more code :)
Ok.
Then you'll need to show a bit more code :)
Just as an observation, which I'll let I8 elaborate on if he so chooses (and this isn't mean to contridict anything said so far), generally the safest way to send compound objects across heterogeneous networks is to serialise them first. This removes doubt over things such as packing or data type sizes. It is; however, more work since you need to define a serialization protocol.
ASKER
yes, I think the struct is not padded.. AIP_Addr here is just an u_short, it's just another name for it.. so say when I want to send a struct with AIP_Addr of 2, I should do the following:
Is the code below correct?
I've attached a picture on how I laid out the struct
Open in new window
pic.JPG