簡體   English   中英

如何在C中的TCP套接字上構建協議標頭和主體

[英]how do I build a protocol header and body over a tcp socket in C

我正在寫一個塔卡奇+客戶

我試圖編寫一個簡單的數據包發送到服務器,檢查了RFC頁面 ,發現協議需要在每個數據包中獲取此標頭:

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

現在我對此很陌生,我不確定如何構建此標頭,是否正在創建這樣的緩沖區足夠好?:

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

然后以相同的方式獲取此緩沖區並將其附加到主體並發送:

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

還是有另一種方式來完成整個數據包的構建?

您所擁有的根本無法產生正確的輸出!

以下是可移植的:

#include <stdint.h>
#include <stdlib.h>
#include <string.h>

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM