外网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
被浏览
56
1 个回答
abcd
abcd 认证专家 4小时前
我只是个路过的老年人~

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

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览