📄 testsocket.cpp
字号:
// TestSocket.cpp : implementation file
//
#include "stdafx.h"
#include "TestSocketA.h"
#include "TestSocket.h"
#include "TestSocketACtl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTestSocket
CTestSocket::CTestSocket(CTestSocketACtrl* pTSC)
{
m_pTSC=pTSC;
m_WinThread =NULL;
m_bWaitting =FALSE;
m_bThreadAlive=FALSE;
m_hClose =CreateEvent(NULL,TRUE,FALSE,NULL);
m_hDataEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
m_qSendData.RemoveAll();
m_bConnect=TRUE;
}
CTestSocket::~CTestSocket()
{
TsData *p;
while(!m_qSendData.IsEmpty())
{
p=NULL;
if((p=m_qSendData.RemoveHead())!=NULL)
{
delete p;
}
}
if(m_WinThread)
{
m_WinThread->SuspendThread();
TerminateThread(m_WinThread->m_hThread,0);
delete m_WinThread;
}
CloseHandle(m_hClose);
CloseHandle(m_hDataEvent);
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CTestSocket, CAsyncSocket)
//{{AFX_MSG_MAP(CTestSocket)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
/////////////////////////////////////////////////////////////////////////////
// CTestSocket member functions
void CTestSocket::OnConnect(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
AfxMessageBox("Onconnect");
if(0==nErrorCode)
{
TRACE("Connect Server Successful\n");
BeginThread();
m_bConnect=TRUE;
m_pTSC->KillTimer(1);
}
else //继续重连。
{
if(m_bConnect)
{
//设置重连定时器30s。
m_pTSC->SetTimer(1,3000,NULL);
m_bConnect=FALSE;
}
}
CAsyncSocket::OnConnect(nErrorCode);
}
void CTestSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
ZeroMemory(m_aInBuff,sizeof(m_aInBuff));
int len=CAsyncSocket::Receive(m_aInBuff,2048);
AfxMessageBox("bing");
CAsyncSocket::OnReceive(nErrorCode);
}
/************************************************************************/
/* 函数功能:开启线程ThreadFunc()
/************************************************************************/
BOOL CTestSocket::BeginThread()
{
m_WinThread=AfxBeginThread(ThreadFunc,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
if(m_WinThread)
{
m_bThreadAlive=TRUE;
m_WinThread->ResumeThread();
}
return m_bThreadAlive;
}
/************************************************************************/
/*函数功能:设置事件m_hClose为由标示
/************************************************************************/
BOOL CTestSocket::EndThread()
{
SetEvent(m_hClose);
return TRUE;
}
/************************************************************************/
/* 函数功能:线程函数 */
/************************************************************************/
UINT CTestSocket::ThreadFunc(LPVOID lpParam)
{
CTestSocket *pTS=(CTestSocket*)lpParam;
while(pTS->m_bThreadAlive)
{
if(WaitForSingleObject(pTS->m_hClose,0)==WAIT_OBJECT_0)
{
pTS->m_bThreadAlive=FALSE;
break;
}
TsData sdata;
BOOL bHasData=FALSE;
int result=::WaitForSingleObject(pTS->m_hDataEvent,10000);
bHasData=pTS->GetHeadSendData(&sdata);
if(pTS->IsCmdQueEmpty())
ResetEvent(pTS->m_hDataEvent);
switch(result)
{
case WAIT_OBJECT_0:
{
if(!pTS->m_bWaitting&&bHasData)
{
pTS->m_bWaitting=TRUE;
pTS->SendNetData(&sdata);
// if(sdata.THead.)
}
}
}
}
return 0;
}
BOOL CTestSocket::AddNetData(TsData *pSData)
{
TsData* p=new TsData;
*p=*pSData;
p->THead.CHead=NET_PROTOCOL_HEAD;
m_muSendData.Lock();
m_qSendData.AddTail(p);
m_muSendData.Unlock();
SetEvent(m_hDataEvent);
return TRUE;
}
BOOL CTestSocket::GetHeadSendData(TsData* pSData)
{
BOOL bRes=FALSE;
TsData *p=NULL;
m_muSendData.Lock();
if(!m_qSendData.IsEmpty())
{
p=m_qSendData.GetHead();
}
if(p)
{
*pSData=*p;
bRes=TRUE;
}
m_muSendData.Unlock();
return bRes;
}
BOOL CTestSocket::IsCmdQueEmpty()
{
BOOL bEmpty=TRUE;
m_muSendData.Lock();
bEmpty=m_qSendData.IsEmpty();
m_muSendData.Unlock();
return bEmpty;
}
int CTestSocket::SendNetData(TsData* pSData)
{
memcpy(m_aOutBuff,pSData,pSData->THead.nLength);
int len=0;
len=CAsyncSocket::Send(m_aOutBuff,pSData->THead.nLength);
Sleep(10);
return len;
}
void CTestSocket::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
AfxMessageBox("OnAccept");
CAsyncSocket::OnAccept(nErrorCode);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -