cpp connect()函数被无限期阻塞

时间:2018-05-26 16:34:28

标签: c++ connect

#include <sys/socket.h>
#include <cstdio>
#include <stdlib.h>
#include <iostream>
#include <errno.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#define BUFSIZE 5000
#define PORT 80
using namespace std;
int main(int argc, char* argv[]){
    char buffer[BUFSIZE];
    int sockfd;
    struct sockaddr_in their_addr;
    if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1){
        perror("Socket generating failed");
        exit(1);
    }
    their_addr.sin_family = AF_INET;
    their_addr.sin_port = htons(PORT);
    their_addr.sin_addr.s_addr = htonl(((struct in_addr*)gethostbyname("www.google.com")->h_addr_list[0])->s_addr);
    if(connect(sockfd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr)) == -1){ // stops at here!
        perror("Connection failed");
        exit(1);
    }
    close(sockfd);
    return 0;

作为gethostbyname + connect组合的测试,我写了一个简单的代码。 它通过gethostbyname()查询谷歌的IP地址,连接到谷歌什么都不做,并关闭套接字。 但是,程序只是在connect()函数的一行停止,没有任何错误,包括perror()。 我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

获取s_addr,确保它是一个ipv4地址,然后在命令行上尝试使用'ping addr'命令ping该地址

之后你可以尝试像nmap这样的程序,但很可能ping就足够了。

您的代码可能没有任何问题。您需要查看是否存在代理或防火墙或其他任何干扰您的网络连接的内容。您还需要确认您获得的是使用gethostbyname

的ipv4地址

答案 1 :(得分:0)

我通过删除htonl解决了这个问题。我不知道为什么,以及将来因删除它会发生什么。但这将是我最好的。

答案 2 :(得分:-2)

套接字API不是C ++的一部分,它是posix。 gethostbyname()已过时,请改用getaddrinfo。阅读相应的man page,它还包含您要查找的代码......