Sockets 为什么我的连接失败?

Sockets 为什么我的连接失败?,sockets,networking,network-programming,Sockets,Networking,Network Programming,我正在尝试进行基本的套接字调用,并尝试连接到google.com,但连接调用总是失败并返回-1。有什么原因说明它一定失败了吗 int main() { int sockfd; struct addrinfo *ai; char port[4]; if(sockfd = socket(AF_INET, SOCK_STREAM, 0) < 0) { printf("socket return -1"); } sprintf(por

我正在尝试进行基本的套接字调用,并尝试连接到google.com,但连接调用总是失败并返回-1。有什么原因说明它一定失败了吗

int main()
{
    int sockfd;
    struct addrinfo *ai;
    char port[4];
    if(sockfd = socket(AF_INET, SOCK_STREAM, 0) < 0) {
        printf("socket return -1");
    }
    sprintf(port, "%d", 80);
    if(getaddrinfo("www.google.com", port, NULL, &ai) < 0)
        printf("-2\n");

    if(connect(sockfd, ai->ai_addr, sizeof(*ai->ai_addr)) < 0)
        printf("connect failed -1");
}
intmain()
{
int-sockfd;
结构addrinfo*ai;
字符端口[4];
if(sockfd=socket(AF_INET,SOCK_STREAM,0)<0){
printf(“插座返回-1”);
}
sprintf(端口,“%d”,80);
if(getaddrinfo(“www.google.com”,port,NULL,&ai)<0)
printf(“-2\n”);
如果(连接(sockfd,ai->ai_addr,sizeof(*ai->ai_addr))<0)
printf(“连接失败-1”);
}

我相信问题出在参数
sizeof(*ai->ai\u addr)
上。ai->ai_addr返回指向sockaddr结构的指针,取消引用会将您带到结构本身

struct sockaddr {
   unsigned short sa_family;   // address family, AF_xxx
   char           sa_data[14]; // 14 bytes of protocol address
};
sizeof返回的是整个结构的大小,而不是地址的长度

尝试使用参数
ai->ai\u addrlen

尝试
sizeof(ai->ai\u addr)
。另外,在
getaddrinfo()
之后打印出
ai
中的内容,以确保它是合理的。嗯,well connect()在失败时会设置errno。使用peror()并发布结果如何?