首页 > 解决方案 > 如何在c中解析tcp数据包有效负载

问题描述

我想编写一个接收 TCP 协议数据并解析头和正文的 ac 程序。为此,我创建了数据包结构来表示标头和正文字段:

struct header {
  unsigned int command_length:32;
  unsigned int command_id:32;
  unsigned int command_status:32;
  unsigned int sequence_number:32; };

struct bind_transceiver {
  char System_id;
  char password;
  char system_type;
  int interface_version;
  int addr_ton;
  int addr_npi;
  char address_range; };

struct packet {
  struct header header; 
  char body[91]; };

当服务器套接字接收到数据时,它将数据存储在一个名为buff的 char 变量中。然后它将buff发送到header_parse函数进行解析:

#define MAX_SIZE 10000
... 
...
char buff[MAX_SIZE];
read(sockfd, buff, MAX_SIZE);
header_parse (sockfd, buff);

header_parse函数中,我创建了一个数据包结构并使用memcopy将buff复制到它

header_parse (int sockfd,  void *data ){
  struct packet *_packet;
  _packet = calloc (1, sizeof (struct packet));
  memcpy (_packet, data,  sizeof(data) );
...
}

标题被正确复制,我可以使用这些行打印它们:

fprintf (file, "command_length : %d\n", _packet->header.command_length);
fprintf (file, "command_id : %d\n",  _packet->header.command_id);
fprintf (file, "command_status : %d\n", _packet->header.command_status);
fprintf (file, "sequence_number : %d\n", _packet->header.sequence_number); 

根据 command_id 值,我将_packet发送到特定函数以解析正文:

if ( _packet->header.command_id == 150994944 ) {
    bind_transceiver(sockfd, _packet );
}

bind_transceiver函数中,无法进行解析。我试图逐字节打印它。但它是空的或包含程序中另一个变量的值。

void bind_transceiver (int sockfd, struct packet *_packet) {
  for (i=0; i<91; i++) {
    fprintf (file, "***%s\n", &_packet->body[i] );
} }

正文字段内容没有固定长度,我无法像标题一样提取正文。在这种情况下是否有提取 TCP 数据包有效负载的解决方案?

标签: csocketsmemcpystring-parsing

解决方案


推荐阅读