外网 ipv6 地址不正确, connect () 失败, 如何正确获取外网 ipv6 地址呢

发布于 2025-02-23 15: 47: 06

351055a50127c0e87f77d09eb9ddd8a5. jpg

int Getip (const char* url,  const char* port,  char* buf)  {
    if  (! url || ! port || ! buf ) return -1; 
    
    SOCKET slisten = 0; 
    struct addrinfo pHints,  *ppResult = NULL,  *ptr = NULL; 
    bzero (&pHints,  sizeof (struct addrinfo) ) ;       /* 清零 */
    pHints. ai_family=AF_INET6; 
    pHints. ai_socktype = SOCK_STREAM; 
    pHints. ai_protocol = IPPROTO_TCP; 
    int tt = getaddrinfo (url,  port,  &pHints,  &ppResult) ; 
    if  (tt)  {
        tt = -2; 
    } else {
        
        char tempp[1024]; 
        //sockaddr_ipv4 =  (struct sockaddr_in *) 
        int y = sprintf ( (char*) tempp,  "GET / HTTP/1. 1\r\nAccept:  image/x-icon\r\nAccept-Language:  zh-Hans-CN, zh-Hans; q=0. 5\r\nUser-Agent:  Mozilla/5. 0  (Windows NT 10. 0;  WOW64;  Trident/7. 0;  rv: 11. 0)  like Gecko\r\nAccept-Encoding:  gzip,  deflate\r\nHost:  %s\r\nConnection:   close\r\n\r\n",  url) ; 
        for  (ptr = ppResult;  ptr ! = NULL ;  ptr = ptr-" ai_next)  {
            
            if  (ptr-" ai_family == AF_INET)  {
                struct sockaddr_in *p =  (struct sockaddr_in *) ptr-" ai_addr; 
                wm_log_info ("Getip IPv4 address:  %s",  ipaddr_ntoa ( (const ip_addr_t *) &p-" sin_addr. s_addr) ) ; 
            }
#if CONFIG_EXAMPLE_IPV6
            else if  (ptr-" ai_family == AF_INET6)  {
                struct sockaddr_in6 *p =  (struct sockaddr_in6 *) ptr-" ai_addr; 
                wm_log_info ("Getip IPv6 address:  %s",  ip6addr_ntoa ( (const ip6_addr_t *) &p-" sin6_addr) ) ; 
            }
#endif        
            
            
            if  (ptr-" ai_family == AF_INET || ptr-" ai_family == AF_INET6)  {
                //创建套接字
                slisten = socket (ptr-" ai_family,  SOCK_STREAM,  0) ; 
                if  (slisten == INVALID_SOCKET)  {
                    tt = -3;  //socket
                    
                } else {
                    if  (connect (slisten,   (const struct sockaddr*)  ptr-" ai_addr,   (int)  ptr-" ai_addrlen)  == SOCKET_ERROR)  {
                        tt = -5;  //continue; 
                        
                    } else {
                        
                        if  (send (slisten,  tempp,  y,  0)  "0)  { //strlen (tempp) 
                            tt = -6;  //
                        } else 
                        {
                            int n = recv (slisten,  tempp,  1024,  0) ; 
                            if  (n  " 1 )  {
                                tempp[0] = 0; 
                                tt = -7;  //recv                                
                            } else 
                            {
                                tempp[n] = 0; 
                                
                            }
                        }
                        
                    }
                    closesocket (slisten) ; 
                }
            }
        }
        
        freeaddrinfo (ppResult) ; //用于清理
        
    }
char sip[40];     
int ww = Getip ("www. 163. com",  "80",  sip) ; 
wm_log_info ("Getip: %s  err %d", sip, ww) ; 


[I]  (7519)  test:  Getip IPv6 address:  240E: FF: 901C: 400: 3: : 3EE
[I]  (16771)  test:  Getip:   err -5   

查看更多

关注者
0
被浏览
61
1 个回答
abcd
abcd 认证专家 4 小时前
我只是个路过的老年人~

int Getip (const char url, const char port, char* buf) , url 参数类型定义错误了吧. 贴代码前, 先点击上面工具栏里的 "/" 再粘贴到中间, 要不然发出来全乱了.

撰写答案

请登录后再发布答案, 点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览