服务器关闭并重新启动后,客户端无法连接
Clients unable to connect after server shutdown and restart
我的C++网络代码(一个接收字符串并显示字符串的测试服务器)有问题。偶尔,当我关闭服务器(Ctrl-C)然后重新启动它时,客户端无法连接到它。如果我等待大约一分钟,然后再次尝试连接客户端,它会非常完美。执行ps -A | grep my_server
时,我没有发现进程正在运行。然而,如果我试着在大约2分钟内连接,它会很好。
我觉得这很奇怪。
我习惯了Python中有一个稍微类似的问题,在按下Ctrl+C后,我很难连接到端口。在这种情况下,该进程可能仍在运行,我必须手动终止该进程并尝试再次连接(那时它会正常工作)。
有什么代码需要我特别粘贴吗?我接受以下连接:-
NetworkManager* start_listening(char* host, int port) {
keep_running = true;
signal(SIGINT, signal_handler);
int listenfd, connfd, n;
struct sockaddr_in servaddr, cliaddr;
socklen_t clilen;
pid_t pid;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(port);
#ifdef DEBUG
std::cout << "[+] Starting to listen at port " << port << std::endl;
#endif
#ifdef DEBUG
std::cout << "[+] Binding to port" << std::endl;
#endif
bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
#ifdef DEBUG
std::cout << "[+] Starting to listen" << std::endl;
#endif
listen(listenfd, 1024);
clilen = sizeof(cliaddr);
while ( keep_running ) {
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);
#ifdef DEBUG
if ( connfd == -1 ) {
std::cout << "Yikes got an error with errno = " << errno << std::endl;
}
sockaddr_in* pV4Addr = (struct sockaddr_in*)&cliaddr;
int ipAddr = pV4Addr->sin_addr.s_addr;
char str[20];
inet_ntop(AF_INET, &ipAddr, str, 20);
std::cout << "[+] Incoming connection from " << str << std::endl;
std::cout << "[+] Using socket " << connfd << std::endl;
#endif
if ( (pid=fork()) == 0 ) {
close(listenfd);
NetworkManager *nm = new NetworkManager(connfd);
return nm;
} else {
close(connfd);
}
}
if (!keep_running) {
// #TODO kill all children
#ifdef DEBUG
std::cout << "[+] Killing server" << std::endl;
#endif
exit(0);
}
return 0;
}
问题是您没有检查返回值。例如,绑定。这可能会失败。例如,因为您没有使用REUSEADDR来允许绑定到最近使用的端口。这些事情都有一个暂停,当你提到两分钟后它又能工作时,这是一个彻头彻尾的赠品。但实际上,请检查您的返回值——这毕竟是C!
相关文章:
- 检测grpc服务器中关闭的客户端连接
- 如何将请求的客户端连接的 IP 与 QTcpSocket 类中识别的 IP 之一进行比较?
- 如何在客户端连接时在QT中更新QGraphicsView
- 在使用 Poll() 的 TCP 服务器 - 客户端连接中,我是否需要手动设置事件?我从来没有到达 POLLOUT 来写
- COM 客户端连接 COM 服务器所需的文件是什么(进程外方案)
- Apache Thrift C++服务器超时客户端连接
- QJSONRPC 中的客户端连接/断开连接事件
- 从一个客户端连接两个套接字
- 聊天应用程序-从客户端连接到服务器时出现故障
- Boost.asio服务器客户端.连接2台计算机
- 处理客户端连接的最有效方法(套接字编程)
- 在Windows下处理多个客户端连接的最佳方法(不使用线程)
- 视觉对象 我的客户端连接类出了什么问题?C++
- 多线程服务器在不等待客户端连接的情况下退出
- boost::asio客户端连接停止接收数据
- 增强多个客户端连接
- 当客户端连接越来越少的时候(在linux上使用套接字编程),服务器监听的明智方法是什么?
- c++的提升.Asio服务器和客户端连接理解
- 关闭阻塞客户端连接webscokettpp客户端从c# UI应用程序
- 如何使gRPC服务器只支持一个客户端连接