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

📄 socketclass.cpp

📁 UHF RFID Reader Program
💻 CPP
字号:
// SocketClass.cpp: implementation of the CSocketClass class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SocketClass.h"

#ifndef _WIN32_WCE
#include <process.h>
#else
#include <windows.h>
#endif


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSocketClass::CSocketClass()
{
	m_bConnect = FALSE;
	m_bInProgress = FALSE;

	m_hSocket = NULL;
	m_hEvent = NULL;
	m_hThread = NULL;
	InitializeCriticalSection(&m_criticalSection);
	m_hKillEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	m_nCnt = 0;
}

CSocketClass::~CSocketClass()
{
    Stop();
	closesocket(m_hSocket);	
	WSACloseEvent(m_hEvent);
	CloseHandle(m_hThread);
	DeleteCriticalSection(&m_criticalSection);
    CloseHandle(m_hKillEvent);
}


bool CSocketClass::Init(const CString& strIPAddr, int nPort, HWND hWnd)
{

	m_nPort = nPort;
	m_strIPAddr = strIPAddr;

	m_hWnd = hWnd;

#ifndef _WIN32_WCE
	m_hThread=
			(HANDLE)_beginthreadex(NULL,									// Security
				 0,											// Stack size - use default
				 SocketThreadProc,     			// Thread fn entry point
				 (void*) this,	      
				 0,											// Init flag
				 &m_dwThreadId);					// Thread address
#else
	m_hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SocketThreadProc,
		(LPVOID) this,0,(LPDWORD)&m_dwThreadId);	
#endif


	return TRUE;
}

void CSocketClass::Stop()
{
    ::SetEvent(m_hKillEvent);
    WaitForSingleObject(m_hThread, INFINITE);
}

unsigned CSocketClass::SocketThreadProc(LPVOID lParam)
{

	CSocketClass* pThis = reinterpret_cast<CSocketClass*>(lParam);


	WSANETWORKEVENTS events;

	bool bExit = false;
	while(!bExit)
	{
		//
		// Wait for something to happen
		//
        if (WaitForSingleObject(pThis->m_hKillEvent, 100) == WAIT_OBJECT_0)
            break;


			if (!pThis->Connect())
		{
			Sleep(1000);
			continue;
		}

		DWORD dwRet;
		dwRet = WSAWaitForMultipleEvents(1,
									 &pThis->m_hEvent,
									 FALSE,
									 100,
									 FALSE);

		if (dwRet == WSA_WAIT_TIMEOUT)
			continue;

		//
		// Figure out what happened
		//
		int nRet = WSAEnumNetworkEvents(pThis->m_hSocket,
								 pThis->m_hEvent,
								 &events);
		
		if (nRet == SOCKET_ERROR)
		{
			CString str;
			str.Format(_T("WSAEnumNetworkEvents error %ld\n"),WSAGetLastError());
			::PostMessage(pThis->m_hWnd, WM_STATUS_MSG, 0, (LPARAM)AllocBuffer(str));

			break;
		}

		//				 //
		// Handle events //
		//				 //

		// ACCEPT
		bExit = pThis->ProcessNetworkMessage(events.lNetworkEvents);

	} // while....

	return 0; // Normal Thread Exit Code...
}

bool CSocketClass::OnRead()
{

/*
	DWORD dwSize = 0;
	int nRet = ioctlsocket(m_hSocket, FIONREAD, &dwSize);

	if (nRet == -1)
		return true;

	if (dwSize == 0)
		return false;


	BYTE* pData = new BYTE[dwSize+1];
	
	int nRead = recv(m_hSocket, (char*) pData, dwSize, 0);
	if (nRead == -1)
		return true;


	m_recvBuff.Write(pData, nRead);
	delete [] pData;

	while (m_recvBuff.GetBufferLen() > (sizeof(int)*1))
	{
		int nSize = 0;
		int nCommand = 0;
		int nPageId = 0;
		CopyMemory(&nSize, m_recvBuff.GetBuffer(), sizeof(int));
		

		if (nSize && m_recvBuff.GetBufferLen() >= nSize)
		{
			// Read off header
			m_recvBuff.Read((PBYTE) &nSize, sizeof(int));

		////////////////////////////////////////////////////////
			////////////////////////////////////////////////////////
			// SO you would process your data here
			// 
			// I'm just going to post message so we can see the data
			nSize -= sizeof(int);

			int nTrueSize = nSize+1;
			PBYTE pData = new BYTE[nTrueSize];
			
			CString str;

			m_recvBuff.Read(pData,nSize);
			pData[nTrueSize-1] =  NULL;
			str = pData;
//			::PostMessage(m_hWnd, WM_REC_MSG, 0, (LPARAM)AllocBuffer(str));
			m_bReadHeader = TRUE;

			// Clean Up
			delete [] pData;
		}
		else
			break;
	}
*/
	return false;

}

bool CSocketClass::OnWrite()
{
	return false;
}
bool CSocketClass::OnClose()
{
	m_bConnect = FALSE;
	::PostMessage(m_hWnd, WM_STATUS_MSG, 0, (LPARAM)AllocBuffer(_T("Client Disconnected")));
	return false;
}
bool CSocketClass::OnConnect()
{
	m_bConnect = TRUE;
	m_bInProgress = FALSE;
	::PostMessage(m_hWnd, WM_STATUS_MSG, 0, (LPARAM)AllocBuffer(_T("Client Connected")));
	return false;
}

BOOL CSocketClass::Connect()
{
	if  (m_bConnect || m_bInProgress)
		return TRUE;

	m_bReadHeader = TRUE;

	if (m_hEvent)
	{
		WSACloseEvent(m_hEvent);
		m_hEvent = NULL;
	}
	if (m_hSocket)
	{
		closesocket(m_hSocket);
		m_hSocket = NULL;
	}
	

	m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	if (m_hSocket == INVALID_SOCKET)
	{
		TRACE(TEXT("Could not create  socket %ld\n"),WSAGetLastError());
		return FALSE;
	}


	SOCKADDR_IN		saServer;		

	memset(&saServer,0,sizeof(saServer));

	saServer.sin_family = AF_INET;
	saServer.sin_addr.s_addr = inet_addr(AllocBuffer(m_strIPAddr));
	saServer.sin_port = htons(m_nPort);
	int nRet = connect(m_hSocket,(sockaddr*)&saServer, sizeof(saServer));

	if (nRet == SOCKET_ERROR &&
		WSAGetLastError() != WSAEWOULDBLOCK)
	{
		TRACE(TEXT("connect() error %ld\n"),WSAGetLastError());

		closesocket(m_hSocket);

		return FALSE;
	}
	
	
	m_bInProgress = TRUE;

	m_hEvent = WSACreateEvent();
	if (m_hEvent == WSA_INVALID_EVENT)
	{
		closesocket(m_hSocket);
		return FALSE;
	}

	//
	// Request async notification
	//
	nRet = WSAEventSelect(m_hSocket,
						  m_hEvent,
						  FD_CONNECT|FD_CLOSE|FD_READ);
	
	if (nRet == SOCKET_ERROR)
	{
		closesocket(m_hSocket);

		return FALSE;
	}

	return TRUE;
}



void CSocketClass::SendData(CString strData)
{
	EnterCriticalSection(&m_criticalSection);

	CString strHdr;
	CString strPkt;


	int nSize = strData.GetLength();

	m_sendBuff.Write((PBYTE) &nSize, sizeof(nSize));
	m_sendBuff.Write((PBYTE) strData.GetBuffer(nSize), nSize);

	DoAsyncSendBuff();
	LeaveCriticalSection(&m_criticalSection);
}

void CSocketClass::SendData(PBYTE pData, int nSize)
{
	EnterCriticalSection(&m_criticalSection);

	m_sendBuff.Write((PBYTE) &nSize, sizeof(nSize));
	m_sendBuff.Write((PBYTE) pData, nSize);

	DoAsyncSendBuff();
	LeaveCriticalSection(&m_criticalSection);
}



void CSocketClass::DoAsyncSendBuff()
{
	
	int nSendDataLen = m_sendBuff.GetBufferLen();
	PBYTE pData = m_sendBuff.GetBuffer();

	
	m_nBytesSent = 0;
	
	while (m_nBytesSent < nSendDataLen)  
	{
		int nBytes;

		if ((nBytes = send(m_hSocket, (const char*)(LPCTSTR)pData, nSendDataLen - m_nBytesSent,0))
			== SOCKET_ERROR)
		{
			if (GetLastError() == WSAEWOULDBLOCK) 
			{
				TRACE(TEXT("Blocking\n"));
				Sleep(100);
				break;
			}
			else
			{
				TCHAR szError[256];
				wsprintf(szError, _T("Server Socket failed to send: %d"), GetLastError());
				
				closesocket(m_hSocket);
								
				m_nBytesSent = 0;				
				return;
			}
		}
		else
		{
			m_nBytesSent += nBytes;
			m_sendBuff.Delete(nBytes);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -