大家好,我是新手,请大家帮忙解决一下;下面是类封装代码
//h文件
#pragma once
#include <Winsock2.h>
#pragma comment(lib, "WS2_32.LIB")class BaseSocket
{
public:
BaseSocket(void);
virtual ~BaseSocket(void);
private:
CRITICAL_SECTION m_crit;
SOCKET m_socket;
SOCKET m_accept;
WSAEVENT m_EventList[WSA_MAXIMUM_WAIT_EVENTS];
SOCKET m_SockArray[WSA_MAXIMUM_WAIT_EVENTS];
int m_Index;
WSANETWORKEVENTS m_NetworkEvent;
int m_ReturnIndex;
public:
BOOL InitSocket(long PortNum);
static unsigned int __stdcall SocketAcceptFunc(void * pParam);
static unsigned int __stdcall SocketRecvFunc(void * pParam);
void CloseSocket(void);
};
//CPP文件

解决方案 »

  1.   

    #include "StdAfx.h"
    #include "BaseSocket.h"BaseSocket::BaseSocket(void)
    {
    InitializeCriticalSection(&m_crit);
    m_Index=0;}
    BaseSocket::~BaseSocket(void)
    {
    this->CloseSocket();
    EnterCriticalSection(&m_crit);
    LeaveCriticalSection(&m_crit); // 删除临界区变量
    DeleteCriticalSection(&m_crit);}
    BOOL BaseSocket::InitSocket(long PortNum)
    {
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    {
    AfxMessageBox(_T("Load Lib Failed!"));
    return FALSE;
    } m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
    if(INVALID_SOCKET==m_socket)
    {
    AfxMessageBox(_T("Create Socket Failed!"));
    return FALSE ;
    }
    u_long u1=1;
    ioctlsocket(m_socket,FIONBIO,(u_long*)&u1); sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port= htons(PortNum); 
    addr.sin_addr.s_addr= htonl(INADDR_ANY); int nResult=bind(m_socket,(sockaddr*)&addr,sizeof(sockaddr));
    if(SOCKET_ERROR==nResult)
    {
    AfxMessageBox(_T("Bind Failed!"));
    return FALSE;
    }
    nResult=listen(m_socket,5); 
    if(SOCKET_ERROR==nResult)
    {
    AfxMessageBox(_T("Listen Failed!"));
    return FALSE;
    } // m_EventList=WSACreateEvent();
    WSAEVENT NewEvent=WSACreateEvent();
    if (NewEvent==WSA_INVALID_EVENT)
    {
    AfxMessageBox(_T("Create Event Failed!"));
    return FALSE;
    }
    int WESerror=WSAEventSelect(m_socket,NewEvent,FD_ACCEPT|FD_CLOSE);
    if (WESerror==INVALID_SOCKET)
    {
    AfxMessageBox(_T("Register Failed!"));
    return FALSE;
    }
    //WSAEVENT eventArray[WSA_MAXIMUM_WAIT_EVENTS];
    //SOCKET sockArray[WSA_MAXIMUM_WAIT_EVENTS];
    m_Index=0;//int n=0;
    m_EventList[m_Index]=NewEvent;//eventArray[n]=NewEvent;
    m_SockArray[m_Index]=m_socket;//sockArray[n]=m_socket;
    m_Index++;//n++; while(1)
    {
    m_ReturnIndex=WSAWaitForMultipleEvents(m_Index,m_EventList,FALSE,40000,FALSE);
    if ((m_ReturnIndex==WSA_WAIT_FAILED)|(m_ReturnIndex==WSA_WAIT_TIMEOUT))
    {
    AfxMessageBox(_T("Failed!"));
    break;
    }
    else
    {
    // WSANETWORKEVENTS m_NetworkEvent;  WSAEnumNetworkEvents(m_SockArray[m_ReturnIndex-WSA_WAIT_EVENT_0],NULL,&m_NetworkEvent);
     WSAResetEvent(m_EventList[m_ReturnIndex-WSA_WAIT_EVENT_0]);  switch(m_NetworkEvent.lNetworkEvents)
     {
    case  FD_ACCEPT:
    {
    HANDLE m_hThdAcc;
    unsigned int m_ThdIDAcc; m_hThdAcc= ( HANDLE )_beginthreadex( NULL , NULL , SocketAcceptFunc , this ,
    CREATE_SUSPENDED , &m_ThdIDAcc ); if( m_hThdAcc == NULL )
    {
    return FALSE;
    }
    ResumeThread(m_hThdAcc);
    CloseHandle(m_hThdAcc); }
    break;
    case FD_READ:
    {
    HANDLE m_hThdRead;
    unsigned int m_ThdIDRead; m_hThdRead= ( HANDLE )_beginthreadex( NULL , NULL , SocketRecvFunc , this ,
    CREATE_SUSPENDED , &m_ThdIDRead ); if( m_hThdRead == NULL )
    {
    return FALSE;
    }
    ResumeThread(m_hThdRead);
    CloseHandle(m_hThdRead);
    }
    break;
    case FD_CLOSE: {
    if (m_NetworkEvent.iErrorCode[FD_CLOSE_BIT]==0)
    {
    closesocket(m_SockArray[m_Index-WSA_WAIT_EVENT_0]);
    WSACloseEvent(m_EventList[m_Index-WSA_WAIT_EVENT_0]);
    //printf("套接字为【%d】的已关闭连接\n",sockArray[nIndex-WSA_WAIT_EVENT_0]);
    AfxMessageBox(_T("1"));
    }
    else
    {
    if (m_NetworkEvent.iErrorCode[FD_CLOSE_BIT]==10053)
    {
    closesocket(m_SockArray[m_Index-WSA_WAIT_EVENT_0]);
    WSACloseEvent(m_EventList[m_Index-WSA_WAIT_EVENT_0]);
    //printf("客户端【%d】非法关闭连接\n",sockArray[nIndex-WSA_WAIT_EVENT_0]);
    AfxMessageBox(_T("2"));
    }
    }
    for (int j=m_Index-WSA_WAIT_EVENT_0;j<m_Index-1;j++)
    {
    m_SockArray[j]=m_SockArray[j+1];
    m_EventList[j]=m_EventList[j+1];
    }
    m_Index--; }
    default:
    break;  }
    } }
    closesocket(m_socket);
    WSACleanup(); return TRUE;
    }unsigned int __stdcall BaseSocket::SocketAcceptFunc(void * pParam)
    {
    BaseSocket *pParent = (BaseSocket *)pParam; if ((pParent->m_NetworkEvent).iErrorCode[FD_ACCEPT_BIT]==0)
    {
    if (pParent->m_Index>WSA_MAXIMUM_WAIT_EVENTS)
    {
    AfxMessageBox(_T("Too Many Connections!"));
    }
    pParent->m_accept=accept(pParent->m_SockArray[(pParent->m_ReturnIndex)-WSA_WAIT_EVENT_0],NULL,NULL); WSAEVENT sNewEvent=WSACreateEvent();
    WSAEventSelect(pParent->m_accept,sNewEvent,FD_READ|FD_CLOSE);
    pParent->m_EventList[pParent->m_Index]=sNewEvent;
    pParent->m_SockArray[pParent->m_Index]=pParent->m_accept;
    (pParent->m_Index)++;

    }
    _endthreadex(0);
    return 0;}unsigned int __stdcall BaseSocket::SocketRecvFunc(void * pParam)
    {
    BaseSocket *pParent = (BaseSocket *)pParam;
    if ((pParent->m_NetworkEvent).iErrorCode[FD_READ_BIT]==0)
    {
    char buf[256];
    memset(buf,0,256);
    int nRecv=recv(pParent->m_SockArray[(pParent->m_ReturnIndex)-WSA_WAIT_EVENT_0],buf,sizeof(buf),0);
    if (nRecv>0)
    {
    CString tmp;
    tmp.Format(_T("%s"),buf);
    AfxMessageBox(tmp);
    }
    }
    _endthreadex(0);
    return 0;
    }void BaseSocket::CloseSocket(void)
    {
    if ( m_socket != INVALID_SOCKET)
    {
    closesocket(m_socket);
    } if ( m_accept != INVALID_SOCKET )
    {
    closesocket(m_accept);
    } for (int i=0;i<WSA_MAXIMUM_WAIT_EVENTS;i++)
    { closesocket(m_SockArray[i]);
    }
    }
      

  2.   

    然后就在对话框中调用InitSocket(6000),就一执行对话框就死了~~~
      

  3.   

    不好意思,上面说错了,要是在OnInitDialog中初始化,执行的时候不弹出对话框,但是进程中显示在运行:要是按钮执行初始化,对话框就死了~~~~