通过传递ip(getnameinfo)尝试打印名称时出现分段错误

时间:2014-03-10 20:20:46

标签: c linux network-programming

我无法处理它,看不出我的代码有什么问题。

试图通过IP打印(我怀疑的网站)名称,我不能在3天内完成,这让我感到很沮丧。

所以,我的代码:

/**
 * task1.c -- getnameinfo() usage example
 *
 * Copyright (c) 2014 Ovchinnikov Alexzander
 *
 * This code is licensed under a MIT-style license.
 */

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

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

#include <arpa/inet.h>

#include <locale.h>

/**
 * main
 * @param argv количество параметров командной строки (учитая имя программы)
 * @param argv массив строк-параметров командной строки
 */
int main(int argc, char *argv[])
{
    int result;
    struct sockaddr_in *sa;    /* input */
    char hbuf[NI_MAXHOST];

    /*
     * Инициализация подсистемы locale
     */
    (void) setlocale(LC_ALL, "");

    /*
     * Должен быть один и только один аргумент командной строки
     */
    if (2 != argc) {
        fprintf(stderr, "usage: %s IPv4 address\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    /*
    * Что-то делаем
    */
    sa->sin_family = AF_INET;
    sa->sin_port = htons(80);
    result = inet_pton(AF_INET, argv[1], &(sa->sin_addr));
    if (result <= 0){
        if (result == 0){
                fprintf(stderr, "Not in presentation format");
        }else{
            perror("inet_pton");
            exit(EXIT_FAILURE);
        }
    }
    memset(&sa->sin_zero, '\0', sizeof(sa->sin_zero));

    /*
     * Получить имя для адреса в argv[1]
     */
    if (0 != (result = getnameinfo((struct sockaddr *)sa, sizeof(sa), hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD))){
        fprintf(stderr, "getnameinfo() error: %s\n", gai_strerror(result));
    }else{
        fprintf(stdout, "host:%s\n", hbuf);
    }

    return 0;
}

编译时:

gcc -Wall -o task1_2 task1_2.c

,我明白了:

task1_2.c:49:20: warning: ‘sa’ may be used uninitialized in this function
[-Wmaybe-uninitialized]

sa->sin_family = AF_INET;

当像这样跑:

./task1_2 87.240.131.120

,我得到了分段错误。

1 个答案:

答案 0 :(得分:3)

您尚未为sa

分配内存
sa = (struct sockaddr_in*) malloc(sizeof(struct sockaddr_in));