Sending structure with char pointer inside?

im trying to send a package from my program to a Delphi program, the data is of variable size, and if I used char Data [1024]; it will send 1024 bytes, even if the data is 3 bytes, and if the data is more than 1024, it will not send all of this :(

struct Packet
{
    int State_;
    char *Data;
};

struct Packet MyPacket;
MyPacket.Data = (char *) calloc(8, sizeof(char));
memcpy(MyPacket.Data, "thi sis", 8); 
send(Socket, MyPacket, (int)sizeof(struct Packet), 0);

thanks oh, btw, im using gcc under windows

+3
source share
7 answers

An old trick to encapsulate a package in one block is to use an array of length 1 at the end of the Package.

struct Packet 
{
    unsigned packetLengthInBytes_;
    /* All the fixed fields in the packet */
    int  State_;
    /* Generic data in the packet - of actual length given by packetDataLength(packet) */
    char Data[1];
};

unsigned packetDataLength(Packet* packet)
{
    return packet->packetLengthInBytes_ - (sizeof(Packet) - 1);
}

Packet* createPacketFromData(const char* data, unsigned dataSize)
{
    unsigned packetSize = sizeof(Packet) + dataSize - 1;
    Packet* packet = (Packet*)malloc(packetSize);
    packet->packetLengthInBytes_ = packetSize;
    memcpy(packet->Data, data, dataSize);
    return packet;
}

int sendData(int sock, const char* data, unsigned dataSize)
{
    Packet* packet = createPacketFromData(data, dataSize);
    /* [ Yes, think about endian issues.] */
    send(sock, packet, packet->packetLengthInBytes_, 0);
    free(packet);
}

Please note that this means that we have one call to send (), and in general, it can send a packet as a single object with one allocation call and one release call.

+5

. , , , char *, . , , .

+5

(Delphi) , (.. ). struct, . - , XML JASON:

// Code to demonstrate the idea, may not compile.
struct Packet MyPacket;
MyPacket.State_ = 0;
MyPacket.Data = (char *) calloc(8, sizeof(char));
memcpy(MyPacket.Data, "thi sis", 8); 
const char* packetXml = PacketToXml();
/*
packetXml = 
<Packet>
<State>0</State>
<Data>thi sis</Data>
</Packet>
*/
size_t len = strlen(packetXml);
send(Socket, (char*)&len, sizeof(size_t), 0);
send(Socket, packetXml, len, 0);
+1

- , . , , .
()

+1

- , , , ( Data_), . :

  • , .

  • , , :


int length = 8;
char *data = (char *) calloc(length, sizeof(char));
memcpy(data, "thi sis", 8); 
send(Socket, &length, sizeof(length), 0);
send(Socket, data, length, 0);
+1

, , . , . :

struct Packet {
    int State_;
    char *Data;
};
struct PacketHeader {
    uint32_t state;
    uint32_t len;
};

int send_packet(int sock, struct Packet *pkt)
{
    struct PacketHeader hdr;
    int len = strlen(pkt->Data); /* If Data is a C string */
    hdr.state = htonl(pkt->State_);
    hdr.len = htonl(len);
    send(sock, &hdr, sizeof(hdr), 0);
    send(sock, pkt->data, len, 0);
}

Delphi, . , , , .

+1

. :

sizeof(struct Packet)

, , 8 , 4 int 4 char *, 32- .

,

char*

- . char. , sizeof :

char arr[1024];
char* pc = arr;
printf("%d, %d", sizeof(pc), sizeof(arr));
0

Source: https://habr.com/ru/post/1779931/


All Articles