accept的相关疑难杂症,该怎么解决

accept的相关疑难杂症
现状:目前用epoll做大量tcp长连接,每个连接30秒一次心跳,每个连接每秒有一次消息,共有3000个连接。
问题:在达到3000个连接之后,原有连接心跳和消息都正常,也没有延时现象,就是新添加的连接能accept到,可是cliaddr却是不对的IP地址,发送的消息也没有回复,好像不大正常。

模块如下:请帮忙解决!谢谢各位

static int AcceptClientMsg()
{
int i,connfd,epllfds,sockfd;
socklen_t clilen ;
struct sockaddr_in cliaddr,servaddr;
/*初始化连接区*/
InitClientOLQueue(0);
/*初始化线程池*/
InitThreadpool();
/*初始化数据库连接*/
InitDbConnect();
/*心跳定时初始化*/
InitHeartTime();
/*初始化信号异常处理*/
InitChildSigHandle();

giEpollCrl=epoll_create(MAXCLIENT);
SetNonBlocking(gLocalserv.funServerFd);
ev.events=EPOLLIN|EPOLLET ;
ev.data.fd=gLocalserv.funServerFd ; 
if(epoll_ctl(giEpollCrl,EPOLL_CTL_ADD,gLocalserv.funServerFd,&ev)<0)
{
close(gLocalserv.funServerFd);
return -1 ;
}

for(;;)
{
epllfds=epoll_wait(giEpollCrl,events,MAXCLIENT,-1);
if(epllfds==-1)continue;

for(i=0;i<epllfds;i++)
{
if(events[i].data.fd == gLocalserv.funServerFd)
{
/*处理连接句柄*/
clilen=sizeof(cliaddr);
//SERVER_COUNT_LOCK();
connfd=accept(gLocalserv.funServerFd,(struct sockaddr*)&cliaddr,&clilen);
//SERVER_COUNT_UNLOCK();
if(connfd<=0)continue;
#ifdef DEBUG
LogMsg(LOG_EXT,0,"host=%s,connfd=%d,pid=%d",inet_ntoa(cliaddr.sin_addr),connfd,getpid());
#endif

SetNonBlocking(connfd);
ev.data.fd=connfd ;
ev.events=EPOLLIN|EPOLLET ;
if(epoll_ctl(giEpollCrl,EPOLL_CTL_ADD,connfd,&ev)<0)
{
close(connfd);
continue ;
}
/*保存对应FD的登录IP,套接字,活跃度信息*/
stClientOLQueue[connfd].iClientFd=connfd;
stClientOLQueue[connfd].iClientLiveness=LIVENESS;
strcpy(stClientOLQueue[connfd].sClientHost,inet_ntoa(cliaddr.sin_addr));
/*增加共享内存连接数*/
AddServerCount();
}
else if(events[i].data.fd > 0)
{
/*处理句柄消息*/
HandleMessage(events[i].data.fd);
}
}
}
   
return 0;
}

------解决方案--------------------
能把你CS的测试结构写的清楚些吗?
比如
PC1: Server
PC2: Client(3000)
PC3: Client(2)
现在看不清楚你到底是怎么测试的?