我正在写一个塔卡奇+客户
我试图编写一个简单的数据包发送到服务器,检查了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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句