gpt4 book ai didi

c - 错误的输出 inet_ntop

转载 作者:行者123 更新时间:2023-12-03 20:18:59 28 4
gpt4 key购买 nike

我正在尝试从 inet_ntop 打印一个 ip 地址,但输出似乎很奇怪。

该程序似乎运行良好,我成功连接了套接字,但它打印了以下内容:

H��H9�u�H�[]A\A]A^A_�ff.�

这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <arpa/inet.h>

int main(int argc, char *argv[]){
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct addrinfo hints, *result;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
hints.ai_flags = 0;

int s = getaddrinfo("irc.root-me.org", "6667", &hints, &result);
if( s != 0){
printf("erreur\n");
exit(EXIT_FAILURE);
}

int f = connect(sock, result->ai_addr, result->ai_addrlen);
if(f != 0){
printf("erreur connect\n");
}

struct sockaddr_in *sockin;
sockin = (struct sockaddr_in *)result->ai_addr;
char *dst;
inet_ntop(AF_INET, &sockin->sin_addr, dst, sizeof(char *));
printf("%s\n", dst);
freeaddrinfo(result);

exit(0);
}

最佳答案

这里有两个问题:

  • inet_ntop()的第三个参数应该是 char -array 或指向 char 第一个元素的指针-大批。
  • inet_ntop()的第四个参数应该是 尺寸 目标缓冲区,其地址作为第三个参数传递。

  • 你要做的是通过未初始化的 char -指针 dst作为目的地并告诉函数它将指向 sizeof(char*)字节内存。

    AF_INET地址(形式为 xxx.xxx.xxx.xxx)最多使用 4x3 个字符加上 3 个分隔符 . char s 的总和为 15 char s 加 1 个附加 char用作 0 -terminator 使其成为 C-"string",因此更正后的代码如下所示:
    char dst[16] = ""; /* inet_ntop() does not necessarily 0-terminates the result. */
    inet_ntop(AF_INET, &sockin->sin_addr, dst, sizeof dst);

    正如 Filipe Gonçalves 所指出的在 his comment一个可以用 INET_ADDRSTRLEN (如果可用)而不是硬编码的“魔数(Magic Number)” 16为 IPv4 地址的文本表示定义缓冲区大小。这是一件好事。
    inet_ntop() 的文档在这儿:
  • POSIX in general
  • Specific to Linux
  • 关于c - 错误的输出 inet_ntop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31222273/

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