我需要一个方法,以快速检查我的C程序,如果互联网是可用的Rasberry Pi操作系统(debian),在Raspberry Pi 4型号B。
不幸的是,当使用下面的代码时,connect()几乎总是返回零(这意味着连接成功),即使我的路由器的WAN端口是拔出的(并且已经拔出了一段时间),也是如此。
struct addrinfo hints, *res;
int sockfd;
int retv=-1;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if (0 == getaddrinfo("www.example.com", "http", &hints, &res)){
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sockfd >= 0){
retv = connect(sockfd, res->ai_addr, res->ai_addrlen);
close(sockfd);
}
freeaddrinfo(res);
}
if (retv == 0)
//successful
else
//unsuccessful这完全是个坏主意,还是我错过了什么?
发布于 2021-08-28 14:06:04
有些奇怪的事情发生了。问题是它是在哪里发生的?
首先,这种情况是否发生在一个小程序中,它只执行已发布的代码?在启用所有编译器警告的情况下,它是否没有编译警告?
如果这是较大程序的一部分,就无法排除缓冲区溢出导致堆损坏之类的未定义行为。getaddrinfo()可能使用malloc()或类似的方法来分配其结果,因此可能会发生这种情况。
如果您有可用的strace,您可以在strace下运行您的进程,并查看实际的系统调用及其结果。
您还可以检查getaddrinfo()返回的实际数据。因为每一个POSIX connect() documentation
...如果地址的sa_family成员是
AF_UNSPEC,则应重置套接字的对等地址。请注意,尽管没有建立连接,但术语connected'‘用于描述已为其设置对等地址的无连接模式套接字。..。
这和你看到的情况很相似。可以在调用res之前打印connect()结构的内容。
if (0 == getaddrinfo("www.example.com", "http", &hints, &res)){
printf( "res->ai_family = %d, AF_UNSPEC = %d\n",
res->ai_family, AF_UNSPEC );
printf( "res->ai_socktype = %d, SOCK_STREAM = %d\n",
res->ai_socktype, SOCK_STREAM );
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sockfd >= 0){
retv = connect(sockfd, res->ai_addr, res->ai_addrlen);
close(sockfd);
}
freeaddrinfo(res);
}https://stackoverflow.com/questions/68955471
复制相似问题