如何解决多进程 Tcp 服务器不良行为
我正在编写一个可以接受 tcp 连接的程序。 它更多地做我期望它做的事情,但是当它检测到客户端断开连接时,它也在做一些我不明白的事情。
大部分时间 t1 线程将在接受函数上被阻塞。每当客户端断开连接时,它看起来就像是接受函数以某种方式接收它并抛出错误。
TCP 消息处理器:客户端断开连接。处理完成 //正确的行为
接受 TCP 连接时出错:系统调用中断 //不知道为什么会发生这种情况
此外,当我关闭服务器时,无论是否有活动连接,我都会收到来自绑定函数的错误消息 创建新的 TcpCom 对象时只应调用一次
绑定错误:地址已在使用中 //不知道为什么会触发这个。
接受 TCP 连接时出错:系统调用中断 //我相信这是因为当我关闭服务器时 t1 线程在接受函数上被阻塞了。
这是一个在单独线程中调用“AcceptConnections”的函数。 它使用一个新的 TcpCom 对象,我在构造函数中绑定和监听。
void NetCom::StartZGWComms(bool *stop_bit,ZGW * pZGW)
{
tcp = new TcpCom(&servaddrTcp);
std::thread t1(&TcpCom::AcceptConnections,tcp,stop_bit,pZGW);
t1.detach();
}
TcpCom::TcpCom(sockaddr_in *server)
{
if ( ( sockfd = socket(AF_INET,SOCK_STREAM,0) ) < 0 )
Error(const_cast<char *>( "ERROR opening socket"),true);
if (setsockopt (sockfd,SOL_SOCKET,SO_REUSEADDR,&sockReuseEnable,sizeof(sockReuseEnable)) < 0)
Error(const_cast<char *>("SO_REUSEADDR"),true);
if(bind(sockfd,(const struct sockaddr *)server,sizeof(*server))<0)
Error(const_cast<char *>("ERROR on Bind"),true); //This is being called on server shut down.
if(listen(sockfd,5)<0)
Error(const_cast<char *>("ERROR running listen on socket"),true);
}
“AcceptConnections”正在运行一个无限循环,它正在等待新的连接“(if(WaitOnConn..))”。 建立新连接后,它会进行分叉并运行“ProcessTcpMessages”函数作为接收消息、处理消息并返回响应的新进程(这部分工作正常)。
int TcpCom::AcceptConnections(bool *stop_bit,ZGW *pZGW)
{
sockaddr_in clientAddr;
bool isChild = false;
while(true)
{
if(isChild==true) break;
if(WaitOnConn(&clientAddr)==1)
{
pid_t child_pid = fork();
if(child_pid==0)
{
isChild = true;
close(sockfd); //child doesn't need parents fd
//below function is handling receiving messages and sending responses. It works without issues.
ProcessTcpMessages(stop_bit,newsockfd,pZGW);
}
else if(child_pid<0)
std::cout << "TCP Listener: Error couldn't create new \"TCP Message Processor\"\n" << std::endl;
else
{
close(newsockfd); //parent doesn't need childs fd
newsockfd = -1;
}
}
if(*stop_bit==true) break;
}
return 0;
}
int TcpCom::WaitOnConn(sockaddr_in *clientAddr)
{
socklen_t clientAddrLen = sizeof(*clientAddr);
if ((newsockfd = accept(sockfd,(struct sockaddr *)clientAddr,&clientAddrLen) ) < 0)
{
Error( const_cast<char *>("ERROR on accepting TCP connection"),false); //This is being called on every client disconnection
return -1;
}
std::cout << std::endl << "TCP Listener: Connection Accepted. newsockfd = " << newsockfd << std::endl;
return 1;
}
正如信息: 在主线程中,我实现了 Ctrl^C(SIGINT 信号)检测,它正在设置传递给其他函数的“stop_bit”。
Error 函数随处可见。
void Error(char *msg,bool exitOnError)
{
perror(msg);
if(exitOnError) exit(0);
}
提前感谢任何可以帮助我了解那里到底发生了什么的人。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。