递归TCP连接函数出现「Control reaches end of non-void function」错误排查
解决「Control reaches end of non-void function」递归函数错误
你的问题核心是非void类型的函数,所有执行路径必须有明确的返回值,当前代码的if分支(连接失败场景)存在两个致命问题:
- 递归调用
ConnectToBoard(attempts)后,没有将递归的返回值传递回来,当前函数会继续执行到末尾,无任何返回值,触发编译器报错。 - 若你只是在if分支里加
return;,这也不符合uint8_t返回类型的要求——必须返回该类型的有效值,空return会导致未定义行为。
修正后的代码
uint8_t TcpClient::ConnectToBoard(uint8_t attempts) { struct sockaddr_in server; /* server address */ server.sin_family = AF_INET; server.sin_port = htons(port); server.sin_addr.s_addr = inet_addr(ip); if(connect(client_socket, (struct sockaddr *)&server, sizeof(server)) < 0) { close(client_socket); GetStreamSocket(0,0); cout<<"attempts"<<(unsigned)attempts<<endl; if(attempts == 10) { attempts = 0; printf("ERROR: %s\n", strerror(errno)); } attempts++; usleep(500000); // 注:原注释写的5秒错误,usleep单位是微秒,此处实际是0.5秒;5秒需写5000000 // 关键修改:返回递归调用结果,确保当前分支有明确返回值 return ConnectToBoard(attempts); } else { cout<<"Here inside else of connect to board"<<endl; return 0; } }
额外优化建议
递归实现重试存在栈溢出风险(重试次数过多时),更稳妥的方式是用循环替代递归:
uint8_t TcpClient::ConnectToBoard() { uint8_t attempts = 0; while(true) { struct sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(port); server.sin_addr.s_addr = inet_addr(ip); if(connect(client_socket, (struct sockaddr *)&server, sizeof(server)) >= 0) { cout<<"Connect to board success"<<endl; return 0; } close(client_socket); GetStreamSocket(0,0); cout<<"attempts"<<(unsigned)attempts<<endl; if(attempts == 10) { printf("ERROR: %s\n", strerror(errno)); attempts = 0; } attempts++; usleep(5000000); // 修正为5秒休眠 } }
内容的提问来源于stack exchange,提问作者Деян Цонев
相关产品推荐
相关产品推荐

