【问题标题】:How to read/write from a tcp header bin file如何从 tcp 头 bin 文件中读取/写入
【发布时间】:2015-07-17 08:28:15
【问题描述】:

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

  1. 将二进制文件读入结构并打印标题。
  2. 创建响应标头并将其写入新文件。
  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;
}

【问题讨论】:

    标签: c tcp bin read-write


    【解决方案1】:

    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 打印fopen 和fread 的详细错误消息,并确保在打开文件后在错误情况下调用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);
    

    【讨论】:

    • 好吧,这是有道理的,我在想我必须先将整个 bin 文件直接读入一个数组,然后再解析它。另外,我将如何操作结构中的数组?我将它们作为 char 数组,我需要使用 strcpy 吗?我只是想读入一些数据。假设来自包含 tcp 标头的 bin 文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2012-09-15
    相关资源
    最近更新 更多