#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()
查询google的IP地址,连接到google,什么也不做,然后关闭socket。然而,程序只是停在connect()
函数的一行,没有任何错误,包括perror()
。我该怎么解决这个问题?
3条答案
按热度按时间nukf8bse1#
获取s_addr,确保它是ipv4地址,然后在命令行上尝试使用命令'ping addr' ping该地址
之后,你可以尝试一个像nmap这样的程序,但很可能ping就足够了。
您的代码可能没有任何错误。您需要查看是否有代理或防火墙或其他任何东西干扰您的网络连接。您还需要使用gethostbyname来确认您正在获取一个ipv4地址
4sup72z82#
我通过删除htonl解决了这个问题。我不知道为什么,也不知道将来会发生什么。但这将是我最好的。
bihw5rsg3#
套接字API不是C++的一部分,它是posix。
gethostbyname()
已过时,请改用getaddrinfo
。阅读适当的man page,它还包含作为示例,正是你寻找的代码。