gpt4 book ai didi

c - 如何从 tcp 头 bin 文件读取/写入

转载 作者:可可西里 更新时间:2023-11-01 02:43:32 24 4
gpt4 key购买 nike

我需要一些关于我必须为学校创建的程序的帮助。我不知道如何从 bin 文件中读取和操作数据。 bin 文件是 TCP header 的形式,我需要:

  1. 将二进制文件读入结构并打印文件头。
  2. 创建响应 header 并将其写入新文件。
  3. 读取响应二进制文件并打印标题。

这是我目前所拥有的:

struct tcp
{
unsigned char sourceport[2];
unsigned char destination[2];
unsigned char sequence[4];
unsigned char ackno[4];
unsigned char other[2];
unsigned char window[2];
unsigned char checksum[2];
unsigned char urgent[2];
} my_header;

int readfile(char filename[])
{
FILE *fp;
int pointer, i;
unsigned char buffer[20];
fp = fopen(filename, "r");

if(!fp){ return 1; }

fread(&my_header, sizeof(my_header), 1, fp);
i = 0;
pointer = 0;

while (pointer < 2)
{
my_header.sourceport[pointer] = buffer[pointer];
pointer++;
}

while (pointer < 4)
{
my_header.destination[pointer - 2] = buffer[pointer];
pointer++;
}

while(pointer < 8)
{
my_header.sequence[pointer - 4] = buffer[pointer];
pointer++;
}

while(pointer < 12)
{
my_header.ackno[pointer - 8] = buffer[pointer];
pointer++;
}

while(pointer < 14)
{
my_header.other[pointer - 12] = buffer[pointer];
pointer++;
}
while(pointer < 16)
{
my_header.window[pointer - 14] = buffer[pointer];
pointer++;
}

while(pointer < 18)
{
my_header.checksum[pointer - 16] = buffer[pointer];
pointer++;
}

while(pointer < 20)
{
my_header.urgent[pointer - 18] = buffer[pointer];
pointer++;
}

fclose(fp);
return 0;
}

int main(int argc, char* argv)
{
int check;
unsigned char swap[2];
check = readfile("test.bin");

/* Checking for file to read */
if(check == 0)
{
printf("File successfully read\n");
}

/* If file is not found */
if(check == 1)
{
printf("Cannot open/find file.\n");
}

strcpy(swap,my_header.sourceport);
strcpy(my_header.sourceport, my_header.destination);
strcpy(my_header.destination, swap);
writefile("test.bin");

return 0;
}

最佳答案

readfile 函数有几个问题。

主要问题是您在缓冲区中获取值(未分配)并将这些垃圾值写入您的结构字段。您传递的是 my_header 而不是 buffer 的地址。

此外,您没有检查 fread() 的返回值,因此您不知道调用是否失败或者它是否返回了足够的字节数。

事实证明,直接读取 my_header 实际上是处理此问题的首选方法。假设读取成功并且结构字段的大小和顺序与文件内容相同,您不需要执行任何其他操作。该结构已填充。

所以你的函数应该是这样的:

int readfile(char filename[])
{
FILE *fp;
int bytes_read;

fp = fopen(filename, "r");
if (!fp) {
perror("fopen failed");
return 1;
}

bytes_read = fread(&my_header, sizeof(my_header), 1, fp);
if (bytes_read == -1) {
perror("fread failed");
fclose(fp);
return 1;
} else if (bytes_read != sizeof(my_header)) {
fprintf(stderr, "expected to read %d bytes, actually read %d\n", sizeof(my_header), bytes_read);
fclose(fp);
return 1;
}

fclose(fp);
return 0;
}

注意使用perror打印fopenfread的详细错误信息,并确保调用fclose(fp) 在文件打开后的错误情况下。

编辑:

该结构包含 char 数组,但它们不是字符串而是字节数组,因此您不能对它们使用 strcpy 或其他字符串操作函数。但是,您可以使用 memcpy:

memcpy(swap,my_header.sourceport, 2);
memcpy(my_header.sourceport, my_header.destination, 2);
memcpy(my_header.destination, swap, 2);

关于c - 如何从 tcp 头 bin 文件读取/写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31471428/

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