首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接()-ing http套接字即使没有互联网也会成功。为什么?

连接()-ing http套接字即使没有互联网也会成功。为什么?
EN

Stack Overflow用户
提问于 2021-08-27 14:52:12
回答 1查看 37关注 0票数 0

我需要一个方法,以快速检查我的C程序,如果互联网是可用的Rasberry Pi操作系统(debian),在Raspberry Pi 4型号B。

不幸的是,当使用下面的代码时,connect()几乎总是返回零(这意味着连接成功),即使我的路由器的WAN端口是拔出的(并且已经拔出了一段时间),也是如此。

代码语言:javascript
复制
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

这完全是个坏主意,还是我错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2021-08-28 14:06:04

有些奇怪的事情发生了。问题是它是在哪里发生的?

首先,这种情况是否发生在一个小程序中,它只执行已发布的代码?在启用所有编译器警告的情况下,它是否没有编译警告?

如果这是较大程序的一部分,就无法排除缓冲区溢出导致堆损坏之类的未定义行为。getaddrinfo()可能使用malloc()或类似的方法来分配其结果,因此可能会发生这种情况。

如果您有可用的strace,您可以在strace下运行您的进程,并查看实际的系统调用及其结果。

您还可以检查getaddrinfo()返回的实际数据。因为每一个POSIX connect() documentation

...如果地址的sa_family成员是AF_UNSPEC,则应重置套接字的对等地址。请注意,尽管没有建立连接,但术语connected'‘用于描述已为其设置对等地址的无连接模式套接字。..。

这和你看到的情况很相似。可以在调用res之前打印connect()结构的内容。

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68955471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档