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

📄 udpsocket.cpp

📁 无线数据服务中心源代码:移动或联通的无限数据终端将采集到的数据通过Internet传送到数据中心
💻 CPP
字号:
// UdpSocket.cpp: implementation of the UdpSocket class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "UdpSocket.h"
#include "CommLink.h"

CUdpSocket::CUdpSocket()
{
	m_fWantOpen = FALSE;
	m_fOpened = FALSE;
	m_hStopEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
}

CUdpSocket::~CUdpSocket()
{
	::SetEvent(m_hStopEvent);
	m_threadConnect.WaitForEnd();

	::CloseHandle(m_hStopEvent);
}

void CUdpSocket::SetCommLink(CCommLink* pCommLink)
{
	m_pCommLink = pCommLink;
}

void CUdpSocket::SetLocalIpAddress(CIpAddress& ipAddr)
{
	m_ipAddrLocal = ipAddr;
}

void CUdpSocket::Start()
{
	::ResetEvent(m_hStopEvent);
	m_threadConnect.Create(StaticConnectThreadFunc, this);

	m_fWantOpen = TRUE;
}

void CUdpSocket::Stop()
{
	m_fWantOpen = FALSE;
	Close();
	
	SetEvent(m_hStopEvent);
	m_threadConnect.WaitForEnd();
}

DWORD WINAPI CUdpSocket::StaticConnectThreadFunc(void* p)
{
	return ((CUdpSocket*)p)->ConnectThreadFunc();
}

DWORD CUdpSocket::ConnectThreadFunc()
{
	for (;;)
	{
		if (m_fWantOpen && !m_fOpened)
		{
			if (Create(SOCK_DGRAM, FD_READ, m_ipAddrLocal))
			{
				BOOL bAllowBroadcast = TRUE;
				int nRet = setsockopt(m_hSocket, SOL_SOCKET, SO_BROADCAST, (char*)&bAllowBroadcast, sizeof(BOOL));

				m_pCommLink->OnUdpSocketOpen();
				m_fOpened = TRUE;

				for (;;)
				{
					CIpAddress ipAddrPeer;
					int nSize = sizeof(ipAddrPeer);
					int nRxLen = recvfrom(m_hSocket, (char*)m_pbBuf, sizeof(m_pbBuf), 0, &ipAddrPeer, &nSize);
					if (nRxLen == SOCKET_ERROR)
					{
						DWORD dwErr = WSAGetLastError();
						if (dwErr != WSAEWOULDBLOCK)
						{
							Close();
							break;
						}
					}
					else
					{
						m_pCommLink->OnRxPackage(this, ipAddrPeer, m_pbBuf, nRxLen);
					}
					
					if (::WaitForSingleObject(m_hStopEvent, 10) == WAIT_OBJECT_0)
						return 0;
				}
			}
		}

		if (::WaitForSingleObject(m_hStopEvent, 100) == WAIT_OBJECT_0)
			break;
	}

	return 0;
}

void CUdpSocket::OnClear()
{
	CSunnyAsyncSocket::OnClear();
	m_pCommLink->OnUdpSocketClose();
	m_fOpened = FALSE;
}

BOOL CUdpSocket::Write(CIpAddress& ipAddrPeer, BYTE* p, DWORD dwLen)
{
	if (!m_fWantOpen)
		return FALSE;
	try
	{
		int nRet = sendto(m_hSocket, (char*)p, dwLen, 0, &ipAddrPeer, sizeof(CIpAddress));
		return (nRet != SOCKET_ERROR);
	}
	catch (CException* e)
	{
		e->Delete();
	}
}

⌨️ 快捷键说明

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