复制缓冲区中的 IP 地址

Posted

技术标签:

【中文标题】复制缓冲区中的 IP 地址【英文标题】:Copy IP address in buffer 【发布时间】:2018-10-20 20:48:45 【问题描述】:

我正在用 C 语言构建防火墙,但遇到以下问题。我在客户端请求一个 IP 地址,我得到 4 个数字(IP 地址的八位字节采用点分四边形格式)。 就像在这个例子中一样:

255.255.197.0

我在 Integer 类型的数据中得到这 4 个八位字节。要将其复制到 Characters 的缓冲区中,我使用 sprintf() 函数,但出现分段错误。

char buffer[MAX_BUFF_SIZE];            // The buffer to save the IP address
bzero(buffer, sizeof(buffer));    // Clean the buffer

// Gets the address
int o1, o2, o3, o4;
do
 
  printf("Introduce the 4 octets of the IP address (dotted quad format).\n");
  printf("Numbers must go from 0 to 255.\n\n");

  valid = TRUE;
  printf("Introduce first octet (X.-.-.-): ");
  scanf("%d", &o1);
  printf("Introduce second octet (-.X.-.-): ");
  scanf("%d", &o2);
  printf("Introduce third octet (-.-.X.-): ");
  scanf("%d", &o3);
  printf("Introduce fourth octet (-.-.-.X): ");
  scanf("%d", &o4);
  if (o1 < 0 || o1 > 255 || o2 < 0 || o2 > 255 || o3 < 0 || o3 > 255 || o4 < 0 || o4 > 255)
  
    printf("Error [Client]: Invalid number.\n");
    valid = FALSE;
  
 while (valid == FALSE);

// When octets are valid
sprintf(buffer, "%d.%d.%d.%d", o1, o2, o3, o4); // Copy the address in String format in buffer
inet_aton(buffer, &my_rule.addr);
printf("The IP address is %s\n", my_rule.addr);

o1o2o3o4 是地址的 4 个八位字节。知道如何将这些整数放入char 缓冲区吗?

【问题讨论】:

请提供minimal reproducible example,现在您的代码不完整,无法说出究竟是什么问题 好吧,在这之间我做了一些 scanf 来获取 o1、o2、o3 和 o4 值。现在我编辑代码。 bzero 已弃用,请使用 memsetMAX_BUFF_SIZE 是什么? 哦!不知道谢谢!! MAX_BUFF_SIZE 为 1024 字节。 我得到一个分段错误。”在哪一行? 【参考方案1】:

这没有意义:

  printf("The IP address is %s\n", my_rule.addr);

s 转换说明符需要 0-terminate char-array 的第一个元素的地址,一个 C-“字符串”。

代码(很可能,因为您没有显示它)传递了struct in_addr

编译器应该已经警告过你了。


顺便说一句,您知道255.255.197.0 不是有效的 IP 地址,是吗?

【讨论】:

是的,你是对的!我忘了把my_rule.addr.s_addr 谢谢!另外IP是我上面说的一个例子,我什至没有搜索它。 @GuimGonzalez:尝试将 my_rule.addr.s_addr 作为 C 字符串打印也会失败。

以上是关于复制缓冲区中的 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章

recvfrom() 即使是第一次调用中的 UDP 消息,也不会填充来自 IP 地址

Linux arp命令

飞猪IP-代理-换IP作用

将整数复制到缓冲区 memcpy C++

再谈IPC中的管道

将字符串的一部分复制到C中的缓冲区中