首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCP connect()错误代码113(没有主机路由器)- Linux C++

TCP connect()错误代码113(没有主机路由器)- Linux C++
EN

Server Fault用户
提问于 2022-08-19 11:29:49
回答 1查看 970关注 0票数 2

当Errno代码113 (没有路由器到主机)发生时如何排除故障?

我有一个Linux嵌入式设备,在并发模式下带有wifi模块。我目前遇到的问题是,当嵌入式设备连接到A设备时,嵌入式设备通过"arp“命令获得A设备的IP,以设置addrinfo结构(非阻塞)。Connect()函数通过这个addrinfo执行,以完成TCP握手。此时,Errno代码113 (没有路由器到主机)可能会持续发生并导致连接失败。设备A和嵌入式设备确认没有防火墙设置。这个问题是间歇性的。错误发生超过5分钟,然后继续,过了一段时间后再次发生。

附上相关代码

代码语言:javascript
复制
struct addrinfo hints, *servinfo, *p;
int rv;
char ipstr[INET6_ADDRSTRLEN];
bool SucessFlag = true;
static int failedtoconcnt[10];
static int StartRTC[10];
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;//ipv4 & ipv6
hints.ai_socktype = SOCK_STREAM;//tcp
cout << "Try to Connect IP: " << chIP << "Port "<< chPort << endl;
if (strlen(chIP) < 6)   return 2;

for(int j=0;j<2;j++){
    if ((rv = getaddrinfo(chIP, chPort, &hints, &servinfo)) != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
        return -1;
    }
    void *addr;
    if (servinfo->ai_family == AF_INET) { // IPv4
      struct sockaddr_in *ipv4 = (struct sockaddr_in *)servinfo->ai_addr;
      addr = &(ipv4->sin_addr);
      inet_ntop(servinfo->ai_family, addr, ipstr, sizeof(ipstr));
    } else { // IPv6
      struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)servinfo->ai_addr;
      addr = &(ipv6->sin6_addr);
      inet_ntop(servinfo->ai_family, addr, ipstr, sizeof ipstr);
    }

    for (p = servinfo; p != NULL; p = p->ai_next) {
    if ((sockfd[id] = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
        perror("client: socket Error");
        continue;
    }

    if (sockfd[id] != 0){
        for(int i=0;iInvConnectID[i] == 1){
                if (sockfd[id] == sockfd[i+1] && id != i+1){
                    DC_DEBUG_NL("sockfd[%d]=%d", id, sockfd[id]);
                    DC_DEBUG_NL("sockfd[%d]=%d", i+1, sockfd[i+1]);
                    CloseAllSock();
                    SucessFlag = false;
                }
            }
        }
    }

    fcntl(sockfd[id], F_SETFL, O_NONBLOCK);
    if (connect(sockfd[id], p->ai_addr, p->ai_addrlen) == 0)  break;
    sleep(1);
    printf("1errno: %2d\t%s\n",errno,strerror(errno));
    if (connect(sockfd[id], p->ai_addr, p->ai_addrlen) == 0)  break;
    sleep(1);
    printf("2errno: %2d\t%s\n",errno,strerror(errno));
    if (connect(sockfd[id], p->ai_addr, p->ai_addrlen) == 0)  break;
    sleep(1);
    printf("3errno: %2d\t%s\n",errno,strerror(errno));
    if (connect(sockfd[id], p->ai_addr, p->ai_addrlen) == 0)  break;
    sleep(1);
    printf("4errno: %2d\t%s\n",errno,strerror(errno));
}
if (p == NULL) {
    DC_DEBUG_NL("client: failed to connect");
    fprintf(stderr, "client: failed to connect\n");
    close(sockfd[id]);
    return 1;
}
inet_ntop(p->ai_family, toget_in_addr((struct sockaddr *)p->ai_addr), ipstr, sizeof ipstr);
freeaddrinfo(servinfo);
    if (SucessFlag == true){
        break;
    }
}
return 0;
EN

回答 1

Server Fault用户

发布于 2022-08-20 23:40:33

当你打字时,你会看到什么:

代码语言:javascript
复制
$ route

在你想要运行那个软件的机器上的控制台上?

您应该看到类似于以下内容的内容:

代码语言:javascript
复制
Kernel IP routing table
Destination     Gateway    Genmask   Flags Metric Ref    Use Iface
default         1.2.3.4    0.0.0.0   UG    0      0        0 eth0

default目标(0.0.0.0)使路由工作。有点像魔法。如果没有其他IP匹配,则使用默认值发送数据,然后网关负责进一步转发或处理数据包。

如果您的路由中没有一个在标志列下显示UG,那么您就完全错过了网关。如果有这样的线路,也许网关IP就是问题所在。

如果存在名称解析问题,请尝试-n命令行选项:

代码语言:javascript
复制
$ route -n

如果不是这个问题,我将通过打印出来来确保在代码中获得正确的IP地址。这样,您就可以看到代码中是否有问题。我看不出有什么问题,尽管您的代码很难阅读(它是好的老C,而不是C++.你的课在哪里?我有一个项目要做这样的事情,这里,它使用另一个项目来处理IP地址,因为它太乱了!)

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1108589

复制
相关文章

相似问题

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