当前位置:  技术问答>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;


   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模式的。

    
 
 

您可能感兴趣的文章:

  • 为什么socket程序使用gdb调试执行就接受不到数据了呢?
  • 我做了个socket服务器,但是客户端接收数据的时候用select()函数????可接受不到
  • linux下串口发送数据用串口精灵接受不到或为全零
  • 请教关于Kill向子进程发送信号的问题,子进程如何相应信号,为什么子进程接受不到。
  • 在mips板子上,发送串口数据到pc可以,接受pc发来的数据却读不到。
  • **********写了一个简单的UDP程序,接受英文的消息正常,接受中文的消息显示不完整,请问是什么原因
  • 创建消息队列,接受消息失败,接受程序再发送错误消息给发送程序//程序能运行,不出结果
  • 一个简单UDP的程序,客户端发送消息后,服务器端正常接受,但是服务器端发不出消息?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • TCP接受数据问题?当一次到达的数据长度大于接受设置的最大长度时怎么办?
  • 串口通信 发来的一句话为什么偶尔会分开2次接受
  • 关于字符串的接受,截取和处理···
  • 如何使程序(字符界面)接受用户输入的一个浮点数,并把他的整数部分和小数部分分别输出。
  • Parser无法接受中文文件名?
  • socket的接受。大家帮帮忙!
  • 怎样接受 SQL 返回参数?
  • 如何设定队列的长度、接受个数 ????
  • 在线等待,邮件的发送和接受
  • linux下用串口接受和发送数据问题
  • 如何让linux接受简单密码?
  • 能否设置在UDP接收组播时,就拒绝接受单播数据
  • WEB前端 iis7站长之家
  • 请问applet怎么在一装载时先接受jsp页面里传递的一个参数?比如。。。
  • (linux c)socket数据接受后判断是否相等的问题
  • 请教各位:关于linux处理从网卡接受到的数据包
  • 如何使一个JButton 接受 Ctrl + [Enter]的事件?
  • jsp之间传参数接受中文有乱码问题解决方法
  • 问:jboss+tomcat,能接受最大多少请求量?
  • 想知道在linux下键盘的事件是如何接受的。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3