c++编程 epoll模型编程
epoll主动关闭一个没有心跳的套接字后会自动跳到重新连接函数(accept());
///////////////////服务器主动关闭客户端
if (time(NULL) - iter->second.last_active > s_nSecond)
{
printf("del no heart beat sock\n");
EpollCloseSock(sock);
close(sock);
sock = EX_SOCK_INVALID;
}
////
void EpollCloseSock(int sockfd)
{
printf("Dev Close Sock :%d\n",sockfd);
EpollDel(sockfd);
m_MapBuf = "";
}
////
void EpollDel(int sock)
{
struct epoll_event ev;
ev.events = EPOLLIN|EPOLLET;
ev.data.fd = sock;
if(epoll_ctl(m_epfd, EPOLL_CTL_DEL, sock, &ev) < 0)
{
perror("epoll_ctl:EPOLL_CTL_DEL");
}
}
//////以上是代码的部分功能,请各路高手帮我分析原因。
//Accept
if (pEvent->data.fd == lisSocket)
{
if(pEvent->events & EPOLLIN)
{
int confd = 0;
while (true)
{
confd = EpollAccept();//每次主动关闭客户端的时候,客户端会自动重连。
if (confd > 0)
{
AddOneConnection(confd);
SetNonBlocking(confd);
EpollAddNewClient(confd);
}
else
{
if(errno == EAGAIN)
{
break;
}
}
}
}
}
else if(pEvent->events & EPOLLIN)
//if(pEvent->events & EPOLLIN)
{
if (pEvent->data.fd <= 0)
{
return;
}
Read(pEvent->data.fd);
} 求高手指点...... 指点个毛线啊,你问题都没描述清楚,不知道你要问什么 回复 3# weishuo1999
我的问题就是:
服务器epoll这边主动关闭客户端一个连接后,客户端并没有断开,而是又立马自动连上了;定时时间一到,关闭客户端后,又会调用那个EpollAccept()函数。
请帮欧文分析下原因吧! 客户端的代码是怎么写的,有没有可能客户端有自动重连功能?回复 4# wenliang1387
回复 5# weishuo1999
应该不是客户端的问题
在windows系统(iocp)关闭就不会;这个客户端我是用的tcp调试助手。 抓包看看不就清楚了,怀疑是客户端自动重连了。
页:
[1]