• 打印getaddrinfo()返回的地址信息


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <netdb.h>
    #include "DieWithMessage.h"
    
    void PrintSocketAddress(const struct sockaddr *address, FILE *stream);
    
    int main(int argc, char *argv[])
    {
        if(argc != 3)
            DieWithUserMessage("Parameter(s)", "<Address/Name> <Port/Server>");
    
        char *addrString = argv[1];
        char *portString = argv[2];
    
        struct addrinfo addrCriteria;
        memset(&addrCriteria, 0, sizeof(addrCriteria));
    
        addrCriteria.ai_family = AF_UNSPEC;
        addrCriteria.ai_socktype = SOCK_STREAM;
        addrCriteria.ai_protocol = IPPROTO_TCP;
    
        struct addrinfo *addrList;
    
        int rtnVal = getaddrinfo(addrString, portString, &addrCriteria, &addrList);
    
        if(rtnVal != 0)
            DieWithUserMessage("getaddrinfo() failed", gai_strerror(rtnVal));
    
        struct addrinfo *addr;
        for(addr = addrList; addr != NULL; addr = addr->ai_next)
        {
            PrintSocketAddress(addr->ai_addr, stdout);
            fputc('\n', stdout);
        }
    
        freeaddrinfo(addrList);
    
        exit(0);
    }
    
    
    void PrintSocketAddress(const struct sockaddr *address, FILE *stream)
    {
        if(address == NULL || stream == NULL)
            return;
    
        void *numericAddress;
        char addrBuffer[INET6_ADDRSTRLEN];
        in_port_t port;
        switch(address->sa_family)
        {
            case AF_INET:
                numericAddress = &((struct sockaddr_in* ) address)->sin_addr;
                port = ntohs(((struct sockaddr_in *)address)->sin_port);
                break;
            case AF_INET6:
                numericAddress = &((struct sockaddr_in6 *)address)->sin6_addr;
                port = ntohs(((struct sockaddr_in6 *)address)->sin6_port);
                break;
            default:
                fputs("[unknown type]", stream);
                return;
        }
    
        if(inet_ntop(address->sa_family, numericAddress, addrBuffer, sizeof(addrBuffer)) == NULL)
            fputs("[invalid address]", stream);
        else
        {
            fprintf(stream, "%s", addrBuffer);
            if(port != 0)
                fprintf(stream, "-%u", port);
        }
    }
  • 相关阅读:
    vue this,$set方法
    表格的拖拽排序功能---应用splice方法
    ES6方法的特性总结
    template functional
    scrollTop, offsetTop, pageYOffset, scrollY 的区别
    Sass @mixin 与 @include
    关于Vue中props的详解
    前端开发工具宝典
    前端js开发常用的60种工具方法
    element ui table表格里面插槽的使用方法
  • 原文地址:https://www.cnblogs.com/wouldguan/p/2770633.html
Copyright © 2020-2023  润新知