gpt4 book ai didi

c - 从缓冲区中提取数字和字符作为一个完整的字符串

转载 作者:行者123 更新时间:2023-11-30 16:07:24 26 4
gpt4 key购买 nike

我编写了一个 C 程序来监听端口 443 并接收 SSL 数据包:

#include <errno.h>
#include <ctype.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <stdio.h>

#define MAX_SIZE 10000

void* message_processing(int sockfd)
{
char* buff = calloc(MAX_SIZE + 1, sizeof(char));

/*struct handshake *pkt;
pkt = calloc (1, sizeof (struct handshake)); */

while (1) {

int len_of_read_data = read(sockfd, buff, MAX_SIZE);

if (len_of_read_data > 0) {

FILE* file = fopen("logfile", "a");

fprintf(file, "ssl type : %d\n", (int)buff[0]);
fprintf(file, "ssl version : %d.%d\n", (int)buff[1], (int)buff[2]);
fprintf(file, "ssl length : %d%d\n", (int)buff[3], (int)buff[4]);
fprintf(file, "handshake type : %d\n", (int)buff[5]);
fprintf(file, "handshake len : %d%d%d\n", (int)buff[6], (int)buff[7], (int)buff[8]);
fprintf(file, "ssl version : %d.%d\n", (int)buff[9], (int)buff[10]);

fprintf(file, "random : %c\n", buff[11]);
fprintf(file, "random : %c\n", buff[12]);
fprintf(file, "random : %c\n", buff[13]);
fprintf(file, "random : %c\n", buff[14]);
fprintf(file, "random : %c\n", buff[15]);
fprintf(file, "random : %c\n", buff[16]);
fprintf(file, "random : %c\n", buff[17]);
fprintf(file, "random : %c\n", buff[18]);

fclose(file);
}
}
}

int main()
{
struct sockaddr_in serv_addr;
int sock_descriptor = socket(AF_INET, SOCK_STREAM, 0);

int trueval = 1;
setsockopt(sock_descriptor, SOL_SOCKET, SO_REUSEPORT | SO_REUSEADDR, (char*)&trueval, sizeof(trueval));

bzero((char*)&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(443);

bind(sock_descriptor, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
listen(sock_descriptor, 50);

while (1) {

struct sockaddr_in cli_addr;
socklen_t clilen;
clilen = sizeof(cli_addr);

int client_socket = accept(sock_descriptor, (struct sockaddr*)&cli_addr, &clilen);

message_processing(client_socket);

}
}

如您所见,程序从端口 443 读取数据并将其存储在 buff 变量中。我根据 SSL 数据包格式从 buff 中提取 SSL 字段,并将其打印在日志文件中。

问题出在 buff[11]buff[43] 上。该部分是包含数字和字符的随机字符串。我想将 buff[11]-buff[43] 作为一个字符串打印。因此,我首先逐一打印字节以查看内容(然后将它们连接成一个字符串),但有些字节不可读:

random  : �
random :
random : )
random :
random : M
random :
random : #
random :

我是 C 新手,我对解决方案一无所知。谁能指导我如何将 buff 的这一部分提取为包含数字和字符的一个字符串?

最佳答案

您的问题可能与您没有从缓冲区中获取正确的整数有关,其中字符串位于这些整数之后。

而不是:

        fprintf(file, "ssl type : %d\n", (int)buff[0]);
fprintf(file, "ssl version : %d.%d\n", (int)buff[1], (int)buff[2]);

用途:

        int *pInt=(int *)buff;
fprintf(file, "ssl type : %d\n", pInt[0]);
fprintf(file, "ssl version : %d.%d\n", pInt[1], pInt[2]);

等等

后面的pInt[10]是字符串。那将是:

        char *s= (char *)&pInt[11];

请注意,(int)buff[1] 从缓冲区的第二个 char 生成一个 int。但是您已经将 (int)buff[0] 设置为 int,因此要寻址缓冲区中的第二个 int,您需要添加 int 的大小,(int)buff[0 +sizeof(int)] 从缓冲区中获取第二个 int。更简单的方法是使用指向 int 的指针,如我上面所示。

关于c - 从缓冲区中提取数字和字符作为一个完整的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59643204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com