当前位置: 技术问答>linux和unix
哪儿错了。。。疯了。。接受不到进入消息,也不能接受客户的数据
来源: 互联网 发布时间:2017-01-08
本文导语: epoll_event *pSt_ePollEvent; epoll_event st_ePollSocket; m_ePollfd = epoll_create(nMaxClient); //判断创建是否成功 if (SOCKET_ERROR == m_ePollfd) { return FALSE; } //设置EPOLL添加套接...
epoll_event *pSt_ePollEvent;
epoll_event st_ePollSocket;
int nAcceptCountEvent = epoll_wait(pSt_Socket_ePoll->m_ePollfd,pSt_Socket_ePoll->pSt_ePollEvent,1,-1);
这句话也有问题,为什么我第一次进入循环的时候是阻塞的,当一个客户进入后,就没法阻塞了,一直循环,然后一直是 -1返回值。客户进入后 他返回的也是-1
epoll_event st_ePollSocket;
m_ePollfd = epoll_create(nMaxClient);
//判断创建是否成功
if (SOCKET_ERROR == m_ePollfd)
{
return FALSE;
}
//设置EPOLL添加套接字集合
memset(&st_ePollSocket,'',sizeof(st_ePollSocket));
st_ePollSocket.events = EPOLLIN | EPOLLET;
st_ePollSocket.data.fd = m_LisSocket;
//设置EPOLL监视客户端进入套接字
if (SOCKET_ERROR == epoll_ctl(m_ePollfd,EPOLL_CTL_ADD,m_LisSocket,&st_ePollSocket))
{
return FALSE;
}
pthread_create(&hThread_Client,NULL,NetEngine_ePoll_Thread_Accept,this);
bIsRunning = TRUE;
perror("11");
return TRUE;
LPVOID CSocket_ePoll::NetEngine_ePoll_Thread_Accept(LPVOID lParam)
{
CSocket_ePoll *pSt_Socket_ePoll = (CSocket_ePoll *)lParam;
while (pSt_Socket_ePoll->bIsRunning)
{
//用于轮询I/O事件的发生
int nAcceptCountEvent = epoll_wait(pSt_Socket_ePoll->m_ePollfd,pSt_Socket_ePoll->pSt_ePollEvent,1,-1);
for (int i = 0;i m_LisSocket == pSt_Socket_ePoll->pSt_ePollEvent[i].data.fd)
{
struct sockaddr_in st_Client_SockAddr;
memset(&st_Client_SockAddr,'',sizeof(st_Client_SockAddr));
socklen_t nLen_ClientAddr = sizeof(st_Client_SockAddr);
SOCKET m_AccpetSocket = accept(pSt_Socket_ePoll->m_LisSocket,(struct sockaddr *)&st_Client_SockAddr,&nLen_ClientAddr);
if (SOCKET_ERROR == m_AccpetSocket)
{
perror("accetp");
continue;
}
if (!pSt_Socket_ePoll->Socket_ePoll_Srv_SetNoBlocking(m_AccpetSocket))
{
perror("set");
close(m_AccpetSocket);
continue;
}
pSt_Socket_ePoll->st_ePollSocket.events = EPOLLIN | EPOLLET;
pSt_Socket_ePoll->st_ePollSocket.data.fd = m_AccpetSocket;
if (-1 == epoll_ctl(pSt_Socket_ePoll->m_ePollfd,EPOLL_CTL_ADD,m_AccpetSocket,&pSt_Socket_ePoll->st_ePollSocket))
{
perror("ctl");
close(m_AccpetSocket);
continue;
}
printf("连接来自于:%s:%d,分配的socket为:%dn",inet_ntoa(st_Client_SockAddr.sin_addr),ntohs(st_Client_SockAddr.sin_port),m_AccpetSocket);
}
else if (pSt_Socket_ePoll->pSt_ePollEvent[i].events & EPOLLIN)
{
//HANDLE hRecvThread;
//pthread_create(&hRecvThread,NULL,NetEngine_ePoll_Thread_Recv,&pSt_Socket_ePoll->st_ePollEvent[i].data.fd);
//epoll_ctl(pSt_Socket_ePoll->m_ePollfd,EPOLL_CTL_DEL,pSt_Socket_ePoll->st_ePollEvent[i].data.fd,&pSt_Socket_ePoll->st_ePollSocket);
char szRecvBuffer[NETENGINE_EPOLL_RECVBUFFER_MAX + 1] = {0};
memset(szRecvBuffer,'',NETENGINE_EPOLL_LISTEN_MAX + 1);
int nRecvLen = recv(pSt_Socket_ePoll->pSt_ePollEvent[i].data.fd,szRecvBuffer,NETENGINE_EPOLL_RECVBUFFER_MAX + 1,0);
if (0 == nRecvLen)
{
printf("有客户端退出!n");
return (LPVOID)-2;
}
else if (0 pSt_ePollEvent[i].data.fd,szRecvBuffer,nRecvLen);
}
else
{
perror("发生错误n");
return (LPVOID)-1;
}
}
else
{
printf("可写 ");
}
}
}
return NULL;
}
int nAcceptCountEvent = epoll_wait(pSt_Socket_ePoll->m_ePollfd,pSt_Socket_ePoll->pSt_ePollEvent,1,-1);
这句话也有问题,为什么我第一次进入循环的时候是阻塞的,当一个客户进入后,就没法阻塞了,一直循环,然后一直是 -1返回值。客户进入后 他返回的也是-1
|
不停的返回说明有某个套接字里有数据,而且还是个LT模式的。