- 论坛徽章:
- 0
|
在linux下用epoll写了个tcp的类,但是在测试的时候发现接受连接的效率不是很高~,不知道是不是我代码写得有点问题,
测试过程如下:
在redhat 5下运行epoll服务端,在另一台机器上的windows下以完成端口写成的客户端连接服务端
1、循环连接100个客户端,每个连接后都发送一个5字节的数据,每两次连接中间没有Sleep。
服务端显示连接上96个客户端,接收到96个数据。
2、循环连接1000客户端,每个连接后都发送一个5字节的数据,每两次连接中间没有Sleep。
服务端显示连接上987个客户端,接收到987个数据。
3、循环连接1000客户端,每个连接后都发送一个5字节的数据,每两次连接中间没有Sleep(10),
服务端显示连接上1000个客户端,接收到1000个数据。
4、循环连接1000客户端,每个连接后都发送一个5字节的数据,每两次连接中间没有Sleep(1),
服务端显示连接上996个客户端,接收到993个数据。
按照这种测试结果,似乎说明epoll无法承受很快速的连接?
我用windows 的IOCP服务器进行测试,sleep(1)进行连接是OK的。
代码如下:
nfds = epoll_wait(pThis->m_epollfd, events, 1, 10);//million seconds
if (nfds == -1)
{
myPrint("SEPOLL.cpp", __LINE__, "epoll_wait error", errno);
continue;
}
for(i=0;i<nfds;++i)
{
if(events.data.fd == pThis->m_listenfd)
{
connfd = accept(pThis->m_listenfd, (struct sockaddr*)(&ClientAddr), &addrlen);
if(connfd<0)
{
perror("connfd<0");
break;
}
pThis->setnonblocking(connfd);
pContext = pThis->AllocateContext(connfd);
pContext->iConnectionType = CLIENT_CONNECTION;
pContext->addrRemote = ClientAddr;
pThis->GetSockAddr(pContext->sock, pContext->addrLocal);
pThis->AddAConnection(pContext);
ev.data.ptr = (void*)pContext;
ev.events = EPOLLIN|EPOLLERR|EPOLLHUP|EPOLLET;
epoll_ctl(pThis->m_epollfd, EPOLL_CTL_ADD, connfd, &ev);
ev.events = EPOLLOUT|EPOLLET;
epoll_ctl(pThis->m_epollWritefd, EPOLL_CTL_ADD, connfd, &ev);
break;
}
}
else if (events.events&EPOLLERR)
{
pContext = (EPOLL_CONTEXT*)events.data.ptr;
pThis->HandleEPollErr(pContext);
}
else if (events.events&EPOLLHUP)
{
pContext = (EPOLL_CONTEXT*)events.data.ptr;
pThis->HandleEPollHup(pContext);
}
else if (events.events&EPOLLIN)
{
pContext = (EPOLL_CONTEXT*)events.data.ptr;
pThis->HandleEpollIn(pContext);
}
} |
|