Thiago Marquezini
Thiago Marquezini

Reputation: 111

Build struct element with correct size

I am intercepting some packets, and then put them into an structure.

#pragma pack(push, 1)
struct PacketHeader {
    short Size;
    short Checksum;
    short Index;
};
#pragma pack(pop)

I have a packet with PacketHeader and some other bytes that fill this structure:

struct STRUCT_SVC_ROOM_CREATE {
    PacketHeader Header;
    unsigned char TitleLength; // 1 byte
    char* RoomTitle[23];
    short Unknow;
    short Unknow2;
    short Password1;
    short Password2;
    char LastByte;
};

In the above struct, TitleLength is one byte, that in decimal can 0x17 (23) or any number. This number the numbers of chars contained in RoomTitle.

I need to set size of RoomTitle accortng to TitleLenght byte (as decimal number).

How could I modify the struct to handle the text size in the right location inside the struct?

Upvotes: 1

Views: 77

Answers (1)

πάντα ῥεῖ
πάντα ῥεῖ

Reputation: 1

You should do something like follows, to parse the RoomTitle from the packet received at your socket:

struct STRUCT_SVC_ROOM_CREATE {
    PacketHeader Header; // Header length is sizeof(PacketHeader)
    unsigned char TitleLength; // 1 byte
    char RoomTitle[255]; // I suspect you don't have 23 `RoomTitle[23];` char* 
                         // pointers at this point, but just a char* maximally 
                         // sized as the maximum number that TitleLength can hold 
                         // (which is 255).
    short Unknow; // Unknow length is sizeof(short)
    short Unknow2; // ... ditto aso.
    short Password1;
    short Password2;
    char LastByte;
};

As I pointed out in the code comments above

  1. Read the PacketHeader (take care of Size and CRC endianess!)
  2. Read the payload data according to PacketHeader::Size from the packet into another buffer. (Consider to check the CRC)
  3. Read the TitleLength and RoomTitle from the payload data accordingly. Take care, if you want to handle the RoomTitle data as a c-style string, it's actually terminated with '\0'. Also use the TitleLength information when copying elsewhere.
  4. Read the data with well known size coming after (take care of endianess again)

Some pseudo code (not tested):

int recv_ROOM_CREATE_packet(int sockfd, STRUCT_SVC_ROOM_CREATE* packet) {
    read(sockfd,&(packet->Header),sizeof(PacketHeader));
    read(sockfd,&(packet->TitleLength),sizeof(unsigned char));
    read(sockfd,packet->RoomTitle,packet->TitleLength);
    // ensure that packet->RoomTitle is a correctly terminated c-style string
    if(packet->TitleLength < 255) {
        packet->RoomTitle[packet->TitleLength + 1] = `\0`; 
    }
    else {
        packet->RoomTitle[254] = `\0`; 
    }
    // aso ...
}

Upvotes: 1

Related Questions