首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误输出inet_ntop

错误输出inet_ntop
EN

Stack Overflow用户
提问于 2015-07-04 15:28:01
回答 1查看 3.3K关注 0票数 4

我正在尝试从inet_ntop打印一个ip地址,但是输出看起来很奇怪。

程序似乎运行良好,我成功地连接了套接字,但它打印如下:

代码语言:javascript
复制
H��H9�u�H�[]A\A]A^A_�ff.�

这是我的代码:

代码语言:javascript
复制
#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);
}
EN

回答 1

Stack Overflow用户

发布于 2015-07-04 15:46:02

问题

问题在于目标char*的大小,您试图将结果保存在其中,并且它未初始化,您想要做的是将其保存在char[]中。

x86上的sizeof(char*)是4B,在x64上是8B,IP地址通常比那个( IPv4地址在7到15个字节之间)+1(空终止符)要大。

解决方案

您可以按以下方式修复代码:

代码语言:javascript
复制
char dst[16] = {0};
inet_ntop(AF_INET, &sockin->sin_addr, dst, sizeof(dst));

修复后:

代码语言:javascript
复制
$ ./main
212.83.153.145

源代码

如果你想要完整的固定主机,我有上传到github。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31222273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档