⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testsocket.cpp

📁 适合初学者
💻 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 + -