c - 如何在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 数据包有效负载的解决方案?
解决方案
推荐阅读
- python-3.x - 找不到使用 python3 和 Beautifulsoup 更改其值的 html 元素
- laravel - Behat 用于 JSON API 测试 + Gitlab CI
- javascript - 加载页面时如何从多个jquery ajax get请求中获取多个输出?
- java - JComboBox 人口
- php - 从 Angular 到 PHP 的 POST
- css - 在 Heroku 上部署 react-app-rewired 和 react-app-rewire-less
- javascript - SVG 和 JS。传递值属性
- swift - Firebase 存储神秘消息:libc++abi.dylib:以 NSException 类型的未捕获异常终止
- crystal-reports - Crystal Reports 中的条件公式 SUM 不起作用
- java - 从我的应用程序发布到 Facebook 时出错