C语言 变量在结构指针声明后使用

11dmarpk  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(106)

我来自巴西,正在学习Linux中的网络套接字编程。我很困惑,因为我不明白这个命令是做什么的:

char datagram[4096];
struct iphdr *iph = (struct iphdr *)datagram;

变量datagamstruct iphdr *iph = (struct iphdr *)之后做什么?我无法理解它背后的编程逻辑。
我在试着破译它背后的程序逻辑。最初我认为iph指针将指向结构iphdr的所有成员,同时它也将指向datagram变量。但我试图通过指针访问datagram值,但我不能。

2uluyalo

2uluyalo1#

第一行为一个4KB的IP数据报分配内存。数据报在开头有一个报头,iph指针可以用来通过iphdr结构的成员按名称访问报头的字段。
这可能会与原始套接字一起使用,因为这是通常使IP头对套接字代码可见的唯一方法。

20jt8wwn

20jt8wwn2#

我附上了一个示例代码,以便更好地理解。

#include <stdio.h>
#include <string.h>

/* Part of ipv4 header in TCP layer */
struct iphdr {
  unsigned char ver : 4; // 4 bits
  unsigned char ihl : 4; // 4 bits
  unsigned char tos;     // 8 bits = 1 byte
  int16_t total_length;  //  16 bits = 2 bytes
  /* others */
};
/*
  struct iphdr occupies 4 bytes in memory
  *---------------------------------------------------------------------*
  | total_length (2 bytes) | tos (1 byte) | ihl (4 bits) | ver (4 bits) |
  *---------------------------------------------------------------------*
 MSB                                                                  LSB
*/

int main(void) {
  char datagram[4096];
  struct iphdr* iph = (struct iphdr *)datagram;

  memset(datagram, 0, sizeof(datagram));

  // 61 = 0x3d = 0011 1101
  // 0011 = 3
  // 1101 = 13
  datagram[0] = 61;
  datagram[1] = 32;

  /*
    LSB                                            MSB
     +----------------------------------------------+
     | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |     ...      |
     +----------------------------------------------+
     |            datagram[0]        | datagram[1]  |
     +----------------------------------------------+
     +-------------------------------+--------------+
     |    ihl        |      ver      |     tos      |
     +-------------------------------+--------------+
  */

  printf("%u\n", iph->ver);
  printf("%u\n", iph->ihl);
  printf("%u\n", iph->tos);

  return 0;
}

结果是

13
3
32

你必须搜索和理解C结构中的内存分配和C结构的位字段。
正如你提到的,值可以是,并且应该通过结构指针和字符指针访问。
但是,如果您无法访问数据报值,则会出现其他问题。
请检查printf的格式说明符或尝试通过索引从数据报数组中获取数据。

相关问题