Как я могу напечатать значение номера порта? - PullRequest
0 голосов
/ 22 сентября 2019

Попытка заставить программу вернуть IP-адрес вместе с номером порта, чтобы я мог создать эффективную программу TCP Client / Server.Боритесь с функцией getaddrinfo () на данный момент и понимаете, что 2-й аргумент в функции - это то, что обозначает номер порта.Я могу заставить его вернуть IP, но не могу вернуть номер порта.Я ввожу имя хоста и обозначение порта (например, http или telnet) в виде строки и пытаюсь получить обратно IP-адрес и номер порта, связанный с ним.

Я попытался ввести AI_NUMERICSERV в ai.флаги для ввода числового значения номера порта помимо указания «http» и «telnet».Просто пытаюсь понять сетевое программирование в первый раз.

int main(int argc, char **argv){
    struct addrinfo hints, *res, *p;
    int status;
    char ipstr[INET_ADDRSTRLEN];

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    //  hints.ai_flags = AI_NUMERICSERV;//leaving this off for now

    if((status = getaddrinfo(argv[1], argv[2], &hints, &res)) != 0) 
    {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
        return 2;
    }
    `for(p = res; p != NULL; p = p->ai_next)
    {        
    void *addr;

    struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
    addr = &(ipv4->sin_addr);
    inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
    printf("%s\n", ipstr);
    }

    printf("IP addresses for %s:\n\n", argv[1]); //displays IP correctly
    printf("Port for %s: ", argv[2]); // doesn't display port number
    freeaddrinfo(res);

    return 0;
}

Я ожидаю вывода номера порта рядом с выводом IP-адреса, но я всегда получаю только IP-адрес, а не номер порта.

1 Ответ

0 голосов
/ 22 сентября 2019

Вам нужно прочитать порт (ы), возвращаемый res->ai_addr ...

printf("port=%h\n", ntohs(((struct sockaddr_in*)(res->ai_addr)) ->sin_port));

Если вы просто пытаетесь выяснить, какие порты связаны с конкретными службами, и вына хосте * nix, вы также можете просто grep /etc/services.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...