【问题标题】:How can I print the value of a Port Number?如何打印端口号的值?
【发布时间】:2019-09-22 19:31:13
【问题描述】:

试图让一个程序返回一个 IP 地址和一个端口号,这样我就可以创建一个有效的 TCP 客户端/服务器程序。目前正在努力使用函数 getaddrinfo() 并了解函数中的第二个参数是指定端口号的内容。我可以让它返回一个 IP,但不能让它返回一个端口号。我正在以字符串形式输入主机名和端口名称(例如 http 或 telnet),并尝试取回与之关联的 IP 地址和端口号。

除了指定“http”和“telnet”之外,我已经尝试将 AI_NUMERICSERV 输入到 ai.flags 以输入端口号的数值。第一次尝试了解网络编程。

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 地址而不是端口号。

【问题讨论】:

  • 你传递给程序的参数是什么? AFAIK,getaddrinfo 不会修改前两个参数,因此您应该打印回您的参数。
  • 你为什么不用*res来读取getaddrinfo的结果?

标签: c++ unix network-programming


【解决方案1】:

您需要读取res->ai_addr返回的端口...

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

如果您只是想弄清楚哪些端口与特定服务相关联,并且您在 *nix 主机上,您也可以直接使用 grep /etc/services

【讨论】:

  • res->ai_addr->sin_port 无法编译,因为sin_portsockaddr_in 的字段,但ai_addrsockaddr*。因此,您需要将ai_addr 类型转换为sockaddr_in* 以访问sin_addrsin_port 字段:reinterpret_cast<sockaddr_in*>(res->ai_addr)->sin_port
  • 我知道。使用示例代码中的ipv4 可能更有意义,尽管我想强调结果在res 中。
猜你喜欢
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 2016-03-06
  • 2022-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-01
相关资源
最近更新 更多