DWORD CTCPCustom_CE::SocketThreadFunc(PVOID lparam) 
{ 
        CTCPCustom_CE *pSocket; 
        //得到CTCPCustom类实例指针 
        pSocket = (CTCPCustom_CE*)lparam; 
        //定义读事件集合 
        fd_set fdRead;   
        int ret; 
        TIMEVAL        aTime; 
        aTime.tv_sec = 1; 
        aTime.tv_usec = 0; 
        while (TRUE) 
        { 
        //收到退出事件,结束线程 
                if (WaitForSingleObject(pSocket->m_exitThreadEvent,0) == WAIT_OBJECT_0) 
                { 
                        break; 
                } 
                //置空读事件集合 
                FD_ZERO(&fdRead); 
                //给pSocket设置读事件 
                FD_SET(pSocket->m_socket,&fdRead); 
                //调用select函数,判断是否有读事件发生 
                ret = select(0,&fdRead,NULL,NULL,&aTime); 
                 
                if (ret == SOCKET_ERROR) 
                { 
                        //触发错误事件 
                        pSocket->m_pTCPServer_CE->OnClientError(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,1); 
                        //关闭socket 
                        closesocket(pSocket->m_socket); 
                        break; 
                } 
                 
                if (ret > 0) 
                { 
                        //判断是否读事件 
                        if (FD_ISSET(pSocket->m_socket,&fdRead)) 
                        { 
                                //char recvBuf[1024]; 
                                 
                                char *recvBuf=new char[1024]; 
                                int recvLen; 
                                ZeroMemory(recvBuf,1024); 
                                recvLen = recv(pSocket->m_socket,recvBuf, 1024,0);  
                                if (recvLen == SOCKET_ERROR) 
                                { 
                                        int nErrorCode = WSAGetLastError(); 
                                        //触发与客户端端连接的Socket错误 
                                        pSocket->m_pTCPServer_CE->OnClientError(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,nErrorCode); 
                                        //触发与客户端端连接的Socket关闭事件 
                                        pSocket->m_pTCPServer_CE->OnClientClose(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket); 
                                        //关闭socket 
                                        closesocket(pSocket->m_socket); 
                                        break; 
 
                                } 
                                //表示连接已经从容关闭 
                                else if (recvLen == 0) 
                                { 
                                        pSocket->m_pTCPServer_CE->OnClientClose(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket); 
                                        //关闭socket 
                                        closesocket(pSocket->m_socket); 
                                        break; 
                                } 
                                else 
                                { 
                                                                            //触发与客户端端连接的Socket读事件 
                    pSocket->m_pTCPServer_CE->OnClientRead(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,recvBuf,recvLen); 
                                } 
                         
                        delete[] recvBuf; 
                        } 
                } 
        } 
        return 0; 
}
 |