Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法访问发送到网络的C编程套接字_C++_C_Sockets_Networking_Udp - Fatal编程技术网

C++ 无法访问发送到网络的C编程套接字

C++ 无法访问发送到网络的C编程套接字,c++,c,sockets,networking,udp,C++,C,Sockets,Networking,Udp,我正在尝试将UDP数据包发送到argv[1]中包含的地址,该地址可以是IPv4、IPv6或主机名。当地址为IPv4时,UDP数据包成功发送,但当我使用主机名或IPv6地址时,sendto()抛出错误101“sendto:网络不可访问”。为什么只有当我不使用IPv4时,网络才不可访问?我正在运行Ubuntu14.04,如果这有帮助的话 #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h>

我正在尝试将UDP数据包发送到argv[1]中包含的地址,该地址可以是IPv4、IPv6或主机名。当地址为IPv4时,UDP数据包成功发送,但当我使用主机名或IPv6地址时,sendto()抛出错误101“sendto:网络不可访问”。为什么只有当我不使用IPv4时,网络才不可访问?我正在运行Ubuntu14.04,如果这有帮助的话

#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#include <netdb.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[]) {
    int sockfd, ret;
    struct addrinfo ai_hints;
    struct addrinfo *ai_results;


    /* create an IPv6 UDP socket */
    sockfd = socket(AF_INET6, SOCK_DGRAM, 0);
    if (sockfd == -1) {
        perror("socket");
        return 1;
    }

    /* find UDP IPv6 addresses from command line arg */
    memset(&ai_hints, 0, sizeof(ai_hints));
    ai_hints.ai_family = AF_INET6;
    ai_hints.ai_socktype = SOCK_DGRAM;
    ai_hints.ai_flags = AI_V4MAPPED | AI_ADDRCONFIG; /* defaults */

    ret = getaddrinfo(argv[1], "12345", &ai_hints, &ai_results);
    if (ret != 0) {
        fprintf(stderr, "getaddrinfo(): %s\n", gai_strerror(ret));
        return 1;
    }

    ret = sendto(
        sockfd, "Hello World", 11, 0, 
        ai_results->ai_addr, ai_results->ai_addrlen
    );
    if (ret == -1) {
        printf("errno: %i\n",errno);
        perror("sendto");
        return 1;
    }
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
int sockfd,ret;
结构addrinfo ai_提示;
结构addrinfo*ai_结果;
/*创建IPv6 UDP套接字*/
sockfd=插座(AF_INET6,SOCK_DGRAM,0);
如果(sockfd==-1){
佩罗(“插座”);
返回1;
}
/*从命令行arg查找UDP IPv6地址*/
memset(&ai_提示,0,sizeof(ai_提示));
ai_hits.ai_family=AF_INET6;
ai_hits.ai_socktype=SOCK_DGRAM;
ai_hints.ai_flags=ai_V4MAPPED | ai_ADDRCONFIG;/*默认值*/
ret=getaddrinfo(argv[1]、“12345”、&ai_提示和ai_结果);
如果(ret!=0){
fprintf(stderr,“getaddrinfo():%s\n”,gai_strerror(ret));
返回1;
}
ret=发送到(
sockfd,“你好,世界”,11,0,
人工智能结果->人工智能地址,人工智能结果->人工智能地址
);
如果(ret==-1){
printf(“错误号:%i\n”,错误号);
perror(“sendto”);
返回1;
}
}

您要传递的IPv6地址或主机名是什么?IPv6功能是否适用于来自其他程序的地址/主机名(例如,您能否将相同的参数传递给ping6并使其在那里工作?)我正在尝试传递2001:470:1f06:b9b::2,我必须与之通信的集合服务器的地址。我尝试了ping6,得到了“连接:网络无法访问”。您的本地主机是否有IPv6?在任何情况下,由于您无法
ping
主机,因此这不是编程问题。尝试使用有效的IPv6地址后,一切正常;谢谢你们的洞察力。