¿Cómo construyo un encabezado de protocolo y un cuerpo sobre un socket TCP en C

Estoy escribiendo un cliente tacacs +

Estoy tratando de escribir un paquete simple para enviar al servidor, revisé la página RFC y vi que el protocolo necesita obtener este encabezado en cada paquete:

+----------------+----------------+----------------+----------------+ |major | minor | | | | |version| version| type | seq_no | flags | +----------------+----------------+----------------+----------------+ | | | session_id | +----------------+----------------+----------------+----------------+ | | | length | +----------------+----------------+----------------+----------------+ 

ahora soy bastante nuevo con esto, y no estoy seguro de cómo construir este encabezado, ¿es suficientemente bueno crear un búfer como este ?:

 snprintf(buffer, sizeof(buffer), "%x%x%x%x%x",version,version,type,seq,flags,session_id,length); 

y luego tomar este búfer y adjuntarlo al cuerpo de la misma manera y enviar:

 send(socket,buffer,sizeof(buffer),0); 

¿O hay otra forma de hacer todo este paquete de construcción?

¡Lo que tienes no produce la salida correcta en absoluto!

Lo siguiente es portátil:

 #include  #include  #include  uint8_t* pack_uint8(uint8_t* dest, uint8_t src) { *(dest++) = src; return dest; } uint8_t* pack_uint32be(uint8_t* dest, uint32_t src) { *(dest++) = src >> 24; *(dest++) = (src >> 16) & 0xFF; *(dest++) = (src >> 8) & 0xFF; *(dest++) = src & 0xFF; return dest; } uint8_t* build_packet( uint8_t maj_version, uint8_t min_version, uint8_t type, uint8_t seq, uint8_t flags, uint32_t session_id, uint32_t body_length, const uint8_t* body ) { uint8_t* packet = malloc(12 + body_length); uint8_t* p = packet; p = pack_uint8(p, ( maj_version << 4 ) | min_version); p = pack_uint8(p, type); p = pack_uint8(p, seq); p = pack_uint8(p, flags); p = pack_uint32be(p, session_id); p = pack_uint32be(p, body_length); memcpy(p, body, body_length); return packet; }