c ++ - Tilføjelse af brugerdefineret meddelelsesoverskrift

Indlæg af Hanne Mølgaard Plasc

Problem



Kan nogen fortælle mig: 'Hvordan man opbygger et overskrift?' Jeg skriver en FTP Client-Server kode. Og jeg vil gerne tilføje en header på klientsiden for alle datapakker, jeg skal sende til server med oplysninger som størrelsen af ​​mine data mv.


Jeg har set nogle eksempler på SO men kan ikke 'finde ud af den nøjagtige måde.
Eventuelle peger hen imod prøve/eksempelkode ville blive værdsat.

Bedste reference


Tjek scapy, et bibliotek til konstruktion af pakker. Jeg synes, det er hvad du har brug for.

Andre referencer 1


Den bedste måde at opbygge protokoldata på er at have en buffer på uint8\_t et eller andet sted og udfylde det som angivet i protokollen.


For FTP korrekt er dette ret simpelt, da der kun er ASCII-strenge i kontrolforbindelsen. Noget som dette kan virke:


bool append\_literal(uint8\_t **cursor, uint8\_t *end, uint8\_t const *data, size\_t size) {
    assert(cursor);
    assert(*cursor);
    assert(end);
    assert(*cursor < end);
    assert(data);
    if((end - *cursor) < size)    // Check buffer limit
        return false;
    memcpy(*cursor, data, size);  // Copy
    *cursor += size;              // Increment cursor
    return true;
}

bool append\_number(uint8\_t **cursor, uint8\_t *end, uint64\_t number) {
    assert(cursor);
    assert(*cursor);
    assert(end);
    assert(*cursor < end);
    if((end - *cursor) < 17)     // Max number of base 10 digits in uint64\_t
        return false;
    *cursor += sprintf(*cursor, "\%" PRIu64, number);
    return true;
}

bool append\_uint32\_binary(uint8\_t **cursor, uint8\_t *end, uint32\_t value) {
    assert(cursor);
    assert(*cursor);
    assert(end);
    assert(*cursor < end);
    if((end - *cursor) < 4)      // Bytes needed for uint32 value
        return false;
    *(*cursor)++ = (value >> 24) & 0xff;
    *(*cursor)++ = (value >> 16) & 0xff;
    *(*cursor)++ = (value >> 8) & 0xff;
    *(*cursor)++ = value & 0xff;
    return true;
}

// Specific FTP commands
bool append\_size\_command(uint8\_t **cursor, uint8\_t *end, uint64\_t size) {
    return append\_literal(cursor, end, "SIZE ", 5) &&
        append\_number(cursor, end, size) &&
        append\_literal(cursor, end, "
", 2);
}
// [...]

bool send\_size\_command(int fd, uint64\_t size) {
    uint8\_t buffer[32];
    uint8\_t *cursor = buffer;
    uint8\_t *const end = buffer + sizeof buffer;
    if(!append\_size\_command(&cursor, end, size))
        return false;
    size\_t length = cursor - buffer;
    ssize\_t sent = send(fd, buffer, length, 0);
    return (sent == length);
}


'Assert' udsagn teste ting, der altid vil være sandt, hvis dit program er skrevet korrekt, det vil sige pointerne er gyldige. Enhver funktion returnerer true efter succes, og false, hvis den mislykkedes.


Jeg har brugt standard POSIX-funktioner til stikkontakterne, fordi WinSock implementerer disse, og de er ret bærbare.


Dine hjemmearbejde er at finde de overskrifter, du skal medtage for PRIu64 :)

Andre referencer 2


Definer en struktur med medlemmer, du vil være i din overskrift på begge Client-Server (Bedre at inkludere en header-fil med strukturen i begge). Send overskriften forud for den oprindelige meddelelse. recv på server med parameter for den faste længde af struct.


typedef struct  
{
    DWORD   dwMsgType ; 
    DWORD   dwMsgSize ;
}MSG\_HEADER, *PMSG\_HEADER ;