UINT ClientThread(LPVOID pParam)
{
myStruct* pMyStruct=(myStruct*)pParam;
SOCKET sockClient=pMyStruct->Socket;
HWND hWnd=pMyStruct->hWnd;
int nRet;
timeval timeout={0,200};
fd_set readfds={1,sockClient}; char szBuf[2049];
int nRecv;

while(1)
{
nRet=::select(0, &readfds,NULL,NULL,&timeout);
if(nRet>0){
memset(szBuf,0,2049);
nRecv=recv(sockClient,szBuf,2049,0);
if((nRecv==0)||(nRecv==SOCKET_ERROR))
{
char szTip[]="接受数据失败!";
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
closesocket(sockClient);
return FALSE;
}
char szTip[]="接受到数据!";
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
IN_MSG_HEADER *pHead=(IN_MSG_HEADER*)szBuf;
if(pHead->cmd==MSG_CONNECT_REQ) //请求包
{
IN_REGISTER_REQ* pReq=(IN_REGISTER_REQ*)szBuf;
int nRet1=strncmp(pReq->user,"admin",sizeof("admin"));
int nRet2=strncmp(pReq->password,"admin",sizeof("admin"));
static unsigned int no=0;
if(nRet1==0 && nRet2==0)
{
IN_REGISTER_RESP resp;
resp.hdr.cmd=MSG_CONNECT_RESP;
resp.hdr.length=sizeof(IN_REGISTER_RESP);
resp.hdr.seq_no=no++;
resp.hdr.type=CMD_TYPE_XUNFEI;
resp.result=0; char szTip[]="用户名密码正确!";
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip); int nSend=send(sockClient,(char*)&resp,sizeof(resp),0);
if(nSend<sizeof(resp))
{
char szTip[]="发送回答数据失败!";
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip); closesocket(sockClient);
return FALSE;
} }
else
{
IN_REGISTER_RESP resp;
resp.hdr.cmd=MSG_CONNECT_RESP;
resp.hdr.length=sizeof(IN_REGISTER_RESP);
resp.hdr.seq_no=no++;
resp.hdr.type=CMD_TYPE_XUNFEI;
resp.result=2;
char szTip[]="发送回答用户名密码错误数据!";
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip); int nSend=send(sockClient,(char*)&resp,sizeof(resp),0);
if(nSend<sizeof(resp))
{
char szTip[]="发送回答用户名密码错误数据失败!";
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip); closesocket(sockClient);
return FALSE;
}
}
}
if(pHead->cmd==MSG_EVENT_NOTIFY)
{
char szTip[]="接受到报警数据报!";
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip); IN_EVENT_NOTIFY* pNotify=(IN_EVENT_NOTIFY*)szBuf;
int data=pNotify->data;
char description[256];
_snprintf(description,256,pNotify->description);
char syntax[256];
_snprintf(syntax,256,pNotify->syntax);
int type=pNotify->type;
int eventid=pNotify->event_id;
int eventtype=pNotify->evnet_type; char szDesc[600];
memset(szDesc,0,600);
char szData[4];
if(data)
sprintf(szData,"报警");
else
sprintf(szData,"恢复"); 
sprintf(szDesc,"联动规则:%s_事件源类型:开关量_开关量:%s_状态:报警事件_描述:%s",syntax,szData,description);
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szDesc);
}
}
/*
if(nRet==SOCKET_ERROR)
{
char* szTip=new char[64];
memset(szTip,0,64);
sprintf(szTip,"socketClient错误!");
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
closesocket(sockClient);
AfxEndThread(0,true);
return 0;
}
*/
}

    return 0; 
}
//LoadWinsock用来装载和初始化Winsock,绑定本地地址,创建监听socket,等候客户端连接
UINT LoadWinsock(LPVOID lpParam)
{
CXFServerDlg* pDlg=(CXFServerDlg*)lpParam;

CString strIP;
int nPort=8000;
HWND hWnd;
strIP=pDlg->m_strIP;
nPort=pDlg->m_nPort;
hWnd=pDlg->m_hWnd; sockServer=socket(AF_INET,SOCK_STREAM,0);
if(sockServer==INVALID_SOCKET){
char szTip[]="创建SOCKET失败!";
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
return 0;
}
SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_addr.S_un.S_addr=inet_addr((LPCSTR)strIP);
addr.sin_port=htons(nPort);
if(bind(sockServer,(SOCKADDR*)&addr,sizeof(SOCKADDR))==SOCKET_ERROR){
char szTip[]="SOCKET绑定失败!";
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
return 0;
}
if(listen(sockServer,5)==SOCKET_ERROR){
char szTip[]="SOCKET监听失败!";
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
return 0;
}
char szTip[]="开始监听!";
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
myStruct MyStruct;
    while(1)
{
Sleep(2000);
SOCKADDR_IN addrClient;
int nSize=sizeof(addrClient);
SOCKET sockClient=accept(sockServer,(SOCKADDR*)&addrClient,&nSize);
if(INVALID_SOCKET==sockClient){
char szTip[]="接受SOCKET失败!";
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
break; 
}
char szTip[]="开始接受socketClient";
::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
MyStruct.Socket=sockClient;
MyStruct.hWnd=hWnd;
AfxBeginThread(ClientThread,&MyStruct);
Sleep(500);
}
closesocket(sockServer);
    return 0; 
}

解决方案 »

  1.   

    代码是否有问题需要你自己测试才知道, 
    有时候出现cpu占用99%, 你的 ClientThread 里面的while 加上sleep试试
      

  2.   

    UINT ClientThread(LPVOID pParam)
    {
    myStruct* pMyStruct=(myStruct*)pParam;
    SOCKET sockClient=pMyStruct->Socket;
    HWND hWnd=pMyStruct->hWnd;
    int nRet;
    timeval timeout={0,200};
    fd_set readfds={1,sockClient}; char szBuf[2049];
    int nRecv;

    while(1)
    {
    nRet=::select(0, &readfds,NULL,NULL,&timeout);
    if(nRet>0){
    memset(szBuf,0,2049);
    nRecv=recv(sockClient,szBuf,2049,0);
    if((nRecv==0)||(nRecv==SOCKET_ERROR))
    {
    char szTip[]="接受数据失败!";
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
    closesocket(sockClient);
    return FALSE;
    }
    char szTip[]="接受到数据!";
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
    IN_MSG_HEADER *pHead=(IN_MSG_HEADER*)szBuf;
    if(pHead->cmd==MSG_CONNECT_REQ) //请求包
    {
    IN_REGISTER_REQ* pReq=(IN_REGISTER_REQ*)szBuf;
    int nRet1=strncmp(pReq->user,"admin",sizeof("admin"));
    int nRet2=strncmp(pReq->password,"admin",sizeof("admin"));
    static unsigned int no=0;
    if(nRet1==0 && nRet2==0)
    {
    IN_REGISTER_RESP resp;
    resp.hdr.cmd=MSG_CONNECT_RESP;
    resp.hdr.length=sizeof(IN_REGISTER_RESP);
    resp.hdr.seq_no=no++;
    resp.hdr.type=CMD_TYPE_XUNFEI;
    resp.result=0; char szTip[]="用户名密码正确!";
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip); int nSend=send(sockClient,(char*)&resp,sizeof(resp),0);
    if(nSend<sizeof(resp))
    {
    char szTip[]="发送回答数据失败!";
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip); closesocket(sockClient);
    return FALSE;
    } }
    else
    {
    IN_REGISTER_RESP resp;
    resp.hdr.cmd=MSG_CONNECT_RESP;
    resp.hdr.length=sizeof(IN_REGISTER_RESP);
    resp.hdr.seq_no=no++;
    resp.hdr.type=CMD_TYPE_XUNFEI;
    resp.result=2;
    char szTip[]="发送回答用户名密码错误数据!";
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip); int nSend=send(sockClient,(char*)&resp,sizeof(resp),0);
    if(nSend<sizeof(resp))
    {
    char szTip[]="发送回答用户名密码错误数据失败!";
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip); closesocket(sockClient);
    return FALSE;
    }
    }
    }
    if(pHead->cmd==MSG_EVENT_NOTIFY)
    {
    char szTip[]="接受到报警数据报!";
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip); IN_EVENT_NOTIFY* pNotify=(IN_EVENT_NOTIFY*)szBuf;
    int data=pNotify->data;
    char description[256];
    _snprintf(description,256,pNotify->description);
    char syntax[256];
    _snprintf(syntax,256,pNotify->syntax);
    int type=pNotify->type;
    int eventid=pNotify->event_id;
    int eventtype=pNotify->evnet_type; char szDesc[600];
    memset(szDesc,0,600);
    char szData[4];
    if(data)
    sprintf(szData,"报警");
    else
    sprintf(szData,"恢复"); 
    sprintf(szDesc,"联动规则:%s_事件源类型:开关量_开关量:%s_状态:报警事件_描述:%s",syntax,szData,description);
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szDesc);
    }
    }
    /*
    if(nRet==SOCKET_ERROR)
    {
    char* szTip=new char[64];
    memset(szTip,0,64);
    sprintf(szTip,"socketClient错误!");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
    closesocket(sockClient);
    AfxEndThread(0,true);
    return 0;
    }
    */
    }

        return 0; 
    }
      

  3.   

    你下面的这段代码,如果CPU不是100%,算是操作系统手下留情了,呵呵你这个循环等于死循环
    等价于while( select(...)>0) memset(....);
    问题太多了
    还有这个POST和局部变量的使用,也太危险了吧
      

  4.   

    UINT ClientThread(LPVOID pParam)
    {
        myStruct* pMyStruct=(myStruct*)pParam;
        SOCKET sockClient=pMyStruct->Socket;
        HWND hWnd=pMyStruct->hWnd;
        int nRet;
        timeval timeout={0,200};
        fd_set readfds={1,sockClient};
        char szBuf[2049];
        int nRecv;
        while(1)
        {
        nRet=::select(0, &readfds,NULL,NULL,&timeout);
        if(nRet>0){
    memset(szBuf,0,2049);
    nRecv=recv(sockClient,szBuf,2049,0);
    char* szTip=new char[64];
    memset(szTip,0,64);
    sprintf(szTip,"接受到数据!");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
             if(nRecv<=0)
    {
    break;
    }
    IN_MSG_HEADER *pHead=(IN_MSG_HEADER*)szBuf;
    if(pHead->cmd==MSG_CONNECT_REQ) //请求包
    {
    IN_REGISTER_REQ* pReq=(IN_REGISTER_REQ*)szBuf;
    int nRet1=strncmp(pReq->user,"admin",sizeof("admin"));
    int nRet2=strncmp(pReq->password,"admin",sizeof("admin"));
    static unsigned int no=0;
    if(nRet1==0 && nRet2==0)
    {
    IN_REGISTER_RESP resp;
    resp.hdr.cmd=MSG_CONNECT_RESP;
    resp.hdr.length=sizeof(IN_REGISTER_RESP);
    resp.hdr.seq_no=no++;
    resp.hdr.type=CMD_TYPE_XUNFEI;
    resp.result=0;
    char* szTip=new char[64];
    memset(szTip,0,64);
    sprintf(szTip,"用户名密码正确!");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
    int nSend=send(sockClient,(char*)&resp,sizeof(resp),0);
    if(nSend<sizeof(resp))
    {
    char* szTip=new char[64];
    memset(szTip,0,64);
    sprintf(szTip,"发送回答数据失败!");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
    break;
    }
    }
    else{
    IN_REGISTER_RESP resp;
    resp.hdr.cmd=MSG_CONNECT_RESP;
    resp.hdr.length=sizeof(IN_REGISTER_RESP);
    resp.hdr.seq_no=no++;
    resp.hdr.type=CMD_TYPE_XUNFEI;
    resp.result=2;
    char* szTip=new char[64];
    memset(szTip,0,64);
    sprintf(szTip,"发送回答用户名密码错误数据!");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
    int nSend=send(sockClient,(char*)&resp,sizeof(resp),0);
    if(nSend<sizeof(resp))
    {
    char* szTip=new char[64];
    memset(szTip,0,64);
    sprintf(szTip,"发送回答用户名密码错误数据失败!");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
    break;
    }
             break;
    }
    }
    if(pHead->cmd==MSG_EVENT_NOTIFY)
    {
    char* szTip=new char[64];
    memset(szTip,0,64);
    sprintf(szTip,"接受到报警数据报!");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
    IN_EVENT_NOTIFY* pNotify=(IN_EVENT_NOTIFY*)szBuf;
    int data=pNotify->data;
    char description[256];
    _snprintf(description,256,pNotify->description);
    char syntax[256];
    _snprintf(syntax,256,pNotify->syntax);
    int type=pNotify->type;
    int eventid=pNotify->event_id;
    int eventtype=pNotify->evnet_type;
    char* szDesc=new char[600];
    memset(szDesc,0,600);
    char szData[4];
    if(data)
    sprintf(szData,"报警");
    else
    sprintf(szData,"恢复"); 
    sprintf(szDesc,"联动规则:%s_事件源类型:开关量_开关量:%s_状态:报警事件_描述:%s",syntax,szData,description);
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szDesc);
    }
    }
    /*
    if(nRet==SOCKET_ERROR)
    {
    char* szTip=new char[64];
    memset(szTip,0,64);
    sprintf(szTip,"socketClient错误!");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szTip);
    break;
    }
    */
        }
        closesocket(sockClient);
        return 0; 
    }//LoadWinsock用来装载和初始化Winsock,绑定本地地址,创建监听socket,等候客户端连接
    UINT LoadWinsock(LPVOID lpParam)
    {
    CXFServerDlg* pDlg=(CXFServerDlg*)lpParam;

    CString strIP;
    int nPort=8000;
    HWND hWnd;
    strIP=pDlg->m_strIP;
    nPort=pDlg->m_nPort;
    hWnd=pDlg->m_hWnd; sockServer=socket(AF_INET,SOCK_STREAM,0);
    if(sockServer==INVALID_SOCKET){
    char *szLog=new char[256];
    memset(szLog,0,256);
    strcpy(szLog,"创建SOCKET失败!");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szLog);
    return 0;
    }
    SOCKADDR_IN addr;
    addr.sin_family=AF_INET;
    addr.sin_addr.S_un.S_addr=inet_addr((LPCSTR)strIP);
    addr.sin_port=htons(nPort);
    if(bind(sockServer,(SOCKADDR*)&addr,sizeof(SOCKADDR))==SOCKET_ERROR){
    char *szLog=new char[256];
    memset(szLog,0,256);
    strcpy(szLog,"SOCKET绑定失败!");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szLog);
    return 0;
    }
    if(listen(sockServer,5)==SOCKET_ERROR){
    char *szLog=new char[256];
    memset(szLog,0,256);
    strcpy(szLog,"SOCKET监听失败!");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szLog);
    return 0;
    }
    char *szLog=new char[256];
    memset(szLog,0,256);
    strcpy(szLog,"开始监听!");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szLog);
    myStruct MyStruct;
        while(1)
    {
    Sleep(2000);
    SOCKADDR_IN addrClient;
    int nSize=sizeof(addrClient);
    SOCKET sockClient=accept(sockServer,(SOCKADDR*)&addrClient,&nSize);
    if(INVALID_SOCKET==sockClient){
    char *szLog=new char[256];
    memset(szLog,0,256);
    strcpy(szLog,"接受SOCKET失败!");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szLog);
    closesocket(sockServer);
    return 0; 
    }
    char* szLog=new char[256];
    memset(szLog,0,256);
    strcpy(szLog,"开始接受socketClient");
    ::PostMessage(hWnd,WM_ADDLOG,0,(LPARAM)szLog);
    MyStruct.Socket=sockClient;
    MyStruct.hWnd=hWnd;
    AfxBeginThread(ClientThread,&MyStruct);
    }
    closesocket(sockServer);
        return 0; 
    }void CXFServerDlg::OnBtnStart() 
    {
    // TODO: Add your control notification handler code here
    GetDlgItem(IDC_BTNSTART)->EnableWindow(FALSE);
    GetDlgItem(IDC_BTNSTOP)->EnableWindow(TRUE);
    UpdateData();
    AfxBeginThread(LoadWinsock,this);

    }LRESULT CXFServerDlg::OnAddLog(WPARAM wParam,LPARAM lParam)
    {
    int nLine=m_list.GetCount();
    if(nLine>20)
    {
    for (int i=0;i<nLine;i++)
    {
    m_list.DeleteString( i );
    }
    }
    char* szLog;
    szLog=(LPTSTR)lParam;
    m_list.AddString(szLog);
    delete[] szLog;
    return 0;
    }