当Errno代码113 (没有路由器到主机)发生时如何排除故障?
我有一个Linux嵌入式设备,在并发模式下带有wifi模块。我目前遇到的问题是,当嵌入式设备连接到A设备时,嵌入式设备通过"arp“命令获得A设备的IP,以设置addrinfo结构(非阻塞)。Connect()函数通过这个addrinfo执行,以完成TCP握手。此时,Errno代码113 (没有路由器到主机)可能会持续发生并导致连接失败。设备A和嵌入式设备确认没有防火墙设置。这个问题是间歇性的。错误发生超过5分钟,然后继续,过了一段时间后再次发生。
附上相关代码
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;发布于 2022-08-20 23:40:33
当你打字时,你会看到什么:
$ route在你想要运行那个软件的机器上的控制台上?
您应该看到类似于以下内容的内容:
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 eth0default目标(0.0.0.0)使路由工作。有点像魔法。如果没有其他IP匹配,则使用默认值发送数据,然后网关负责进一步转发或处理数据包。
如果您的路由中没有一个在标志列下显示UG,那么您就完全错过了网关。如果有这样的线路,也许网关IP就是问题所在。
如果存在名称解析问题,请尝试-n命令行选项:
$ route -n如果不是这个问题,我将通过打印出来来确保在代码中获得正确的IP地址。这样,您就可以看到代码中是否有问题。我看不出有什么问题,尽管您的代码很难阅读(它是好的老C,而不是C++.你的课在哪里?我有一个项目要做这样的事情,这里,它使用另一个项目来处理IP地址,因为它太乱了!)
https://serverfault.com/questions/1108589
复制相似问题