epoll客户端断开连接错误

时间:2011-06-22 11:48:23

标签: linux networking epoll

for(int i=0; i<event_cnt; i++){

        SocketClient *conn = reinterpret_cast<SocketClient *>(m_events[i].data.ptr);

        if(m_events[i].events & EPOLLRDHUP){
            printf("ServerManager::eventAcceptLoop, EPOLLRDHUP \n");
            removeClient(conn);
            close(conn->getFd());
        }

        if(conn->getFd() == m_serverSocket->getFd()){

            printf("ServerManager::eventAcceptLoop, A Client has been connected \n");

            struct sockaddr_in clnt_adr;
            socklen_t adr_sz = sizeof(clnt_adr);
            int clnt_sock = accept(m_serverSocket->getFd(), (struct sockaddr*)&clnt_adr, &adr_sz);

            SocketClient* client = new SocketClient(clnt_sock);
            if(!addClient(client))
                break;
        }
        else{

            int recv = conn->recv();

            if(recv <= 0){
                removeClient(conn);
                close(conn->getFd());
            }
            else{
                printf("ServerManager::eventAcceptLoop, A message has been received \n");
                vector<char> data = conn->getData();
                addWork(conn, data);
            }
        }
    }//for loop end

我正在使用epoll进行网络编程。我有这个代码它工作正常,直到客户端断开连接。我创建了一个简单的Java客户端并发送了一个数据包,它正确地接收了数据包。问题是,如果我试图断开连接,它会以某种方式获得许多事件,如EPOLLIN和EPOLLRDHUP。

我添加了像这样的epoll

int addEpollFd(int epfd, SocketClient *socketClient){
    struct epoll_event event;
    event.events = EPOLLIN|EPOLLRDHUP;
    event.data.ptr = reinterpret_cast<void*>(socketClient);
    return epoll_ctl(epfd, EPOLL_CTL_ADD, socketClient->getFd(), &event);
}

可能导致此问题的原因是什么?我该如何解决这个问题?提前谢谢......

修改

我删除了这样的客户端

bool ServerManager::removeClient(SocketClient *clientSock){
    if(removeEpollFd(m_epfd, clientSock) < 0){
        perror("ServerManager::removeClient, remove_epoll error \n");
        return false;
    }
    if(!m_clientList->remove(clientSock))
        perror("ServerManager::removeClient, client remove error \n");

    printf("ServerManager::removeClient, close client \n");
    return true;
}

0 个答案:

没有答案