如何在C中的TCP套接字上构建协议标头和主体

某人

我正在写一个塔卡奇+客户

我试图编写一个简单的数据包发送到服务器,检查了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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在套接字连接中接收 tcp 标志

来自分类Dev

使用Angular 2时如何读取HTTP协议标头?

来自分类Dev

Java中的应用程序层协议标头字段

来自分类Dev

如何在C中通过TCP套接字通过HTTP发送文件?

来自分类Dev

如何在C中通过TCP套接字通过HTTP发送文件?

来自分类Dev

如何在套接字应用程序中加入TCP标头并分块发送文件

来自分类Dev

如何在TCP之上构建协议?

来自分类Dev

如何在Linux C中以编程方式查找cpu套接字和每个套接字的核心数

来自分类Dev

如何在Python客户端和C ++服务器上使用套接字

来自分类Dev

如何从Android的套接字的inputStream()获取TCP标头?

来自分类Dev

如何使用gen_tcp在Elixir中的活动套接字上检测TCP超时?

来自分类Dev

如何使用gen_tcp在Elixir中的活动套接字上检测TCP超时?

来自分类Dev

如何在python中通过udp(DTLS)套接字实现http / 3协议?

来自分类Dev

如何在春季创建后台任务以继续侦听TCP套接字上的数据

来自分类Dev

如何在春季创建后台任务以继续侦听TCP套接字上的数据

来自分类Dev

如何在套接字上编写简单的TCP发送器/接收器

来自分类Dev

如何在C#中通过套接字发送文件

来自分类Dev

套接字 IO - 如何在安全域上配置和连接到 netty 套接字 io 服务器

来自分类Dev

TCP和WEB套接字

来自分类Dev

通过套接字send()的C ++ int:Linux / MacOS上的TCP包中的不同值

来自分类Dev

如何在Swift中通过TCP套接字读取字符串

来自分类Dev

如何在Rails应用程序中实现TCP套接字?

来自分类Dev

如何在libuv中获取可接受的tcp套接字的文件描述符?

来自分类Dev

如何在 C 中使用 TCP 套接字发送 size_t 变量?

来自分类Dev

C / C ++字节序和TCP套接字

来自分类Dev

在套接字上设置TCP ECN(C Linux)

来自分类Dev

通过TCP构建Unix套接字桥

来自分类Dev

如何在春季正确关闭TCP套接字连接?

来自分类Dev

如何在IIS中保持TCP / IP套接字打开?

Related 相关文章

  1. 1

    如何在套接字连接中接收 tcp 标志

  2. 2

    使用Angular 2时如何读取HTTP协议标头?

  3. 3

    Java中的应用程序层协议标头字段

  4. 4

    如何在C中通过TCP套接字通过HTTP发送文件?

  5. 5

    如何在C中通过TCP套接字通过HTTP发送文件?

  6. 6

    如何在套接字应用程序中加入TCP标头并分块发送文件

  7. 7

    如何在TCP之上构建协议?

  8. 8

    如何在Linux C中以编程方式查找cpu套接字和每个套接字的核心数

  9. 9

    如何在Python客户端和C ++服务器上使用套接字

  10. 10

    如何从Android的套接字的inputStream()获取TCP标头?

  11. 11

    如何使用gen_tcp在Elixir中的活动套接字上检测TCP超时?

  12. 12

    如何使用gen_tcp在Elixir中的活动套接字上检测TCP超时?

  13. 13

    如何在python中通过udp(DTLS)套接字实现http / 3协议?

  14. 14

    如何在春季创建后台任务以继续侦听TCP套接字上的数据

  15. 15

    如何在春季创建后台任务以继续侦听TCP套接字上的数据

  16. 16

    如何在套接字上编写简单的TCP发送器/接收器

  17. 17

    如何在C#中通过套接字发送文件

  18. 18

    套接字 IO - 如何在安全域上配置和连接到 netty 套接字 io 服务器

  19. 19

    TCP和WEB套接字

  20. 20

    通过套接字send()的C ++ int:Linux / MacOS上的TCP包中的不同值

  21. 21

    如何在Swift中通过TCP套接字读取字符串

  22. 22

    如何在Rails应用程序中实现TCP套接字?

  23. 23

    如何在libuv中获取可接受的tcp套接字的文件描述符?

  24. 24

    如何在 C 中使用 TCP 套接字发送 size_t 变量?

  25. 25

    C / C ++字节序和TCP套接字

  26. 26

    在套接字上设置TCP ECN(C Linux)

  27. 27

    通过TCP构建Unix套接字桥

  28. 28

    如何在春季正确关闭TCP套接字连接?

  29. 29

    如何在IIS中保持TCP / IP套接字打开?

热门标签

归档