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

📄 tbroadcast_dllhwsocket.cpp

📁 这里将 Socket APIs 封装成一个类似 CAsyncSocket 接口的类
💻 CPP
字号:
// TBroadcast_dllHwSocket.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "TBroadcast_dllHwSocket.h"


// 唯一的应用程序对象

CWinApp theApp;

using namespace std;
BOOL g_bSendBroadcastData = FALSE;

TCHAR* hwFormatMessage ( DWORD dwErrorCode )
{
	static TCHAR szError[256] = {0};
    FormatMessage (
		FORMAT_MESSAGE_FROM_SYSTEM,
		NULL,
		dwErrorCode,
		MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
		szError,
		COUNT(szError),
		NULL);
	return szError;
}

HANDLE m_hEvtEndModule = NULL;

//
// 接收UDP广播数据
//
CHwSocket HwSocket_BroadcastRecv;
DWORD WINAPI Proc_BroadcastRecv(
  LPVOID lpParameter   // thread data
)
{
	USES_CONVERSION;
	if ( !HwSocket_BroadcastRecv.Create (2471, SOCK_DGRAM) )
	{
		cout << "Create socket failed. " << T2A(hwFormatMessage(GetLastError())) << endl;
		return FALSE;
	}
	if ( !HwSocket_BroadcastRecv.SetAsBroadcastSocket () )
	{
		cout << "SetAsBroadcastSocket failed. " << T2A(hwFormatMessage(GetLastError())) << endl;
		return FALSE;
	}

	BYTE szBuffer[1024] = {0};
	// 等待客户端连接
	while ( ::WaitForSingleObject ( m_hEvtEndModule, 0 ) != WAIT_OBJECT_0 )
	{
		CString rSocketAddress;
		UINT rSocketPort;
		int nRecvBytes = HwSocket_BroadcastRecv.ReceiveFrom ( szBuffer, sizeof(szBuffer),rSocketAddress, rSocketPort );

		if ( nRecvBytes > 0 )
		{
			cout << "UDP received data from [" << T2A(rSocketAddress) << ":" << rSocketPort << "] : " << szBuffer << endl;
		}
		else
		{
			DWORD dwLastError = GetLastError();
			if ( (nRecvBytes == 0 && dwLastError != NO_ERROR) || (SOCKET_ERROR == nRecvBytes && dwLastError == WSAEWOULDBLOCK) )
			{
				cout << "None data for read" << endl;
			}
			else
			{
				cout << "Peer disconnect. " << T2A(hwFormatMessage(dwLastError)) << endl;
				break;
			}
		}
	}

	cout << "Proc_BroadcastRecv() thread exit" << endl;
	return TRUE;
}

//
// 发送UDP广播数据
//
CHwSocket HwSocket_BroadcastSend;
DWORD WINAPI Proc_BroadcastSend(
  LPVOID lpParameter   // thread data
)
{
	USES_CONVERSION;
	if ( !HwSocket_BroadcastSend.Create (0, SOCK_DGRAM) )
	{
		cout << "Create socket failed. " << T2A(hwFormatMessage(GetLastError())) << endl;
		return FALSE;
	}
	if ( !HwSocket_BroadcastSend.SetAsBroadcastSocket () )
	{
		cout << "SetAsBroadcastSocket failed. " << T2A(hwFormatMessage(GetLastError())) << endl;
		return FALSE;
	}

	int nCount = 0;
	CString csSendData;
	// 等待客户端连接
	while ( ::WaitForSingleObject ( m_hEvtEndModule, 0 ) != WAIT_OBJECT_0 )
	{
		csSendData.Format ( _T("UDP broadcast data line.%d"), nCount );
		int nSentBytes = HwSocket_BroadcastSend.SendTo ( T2A(csSendData), csSendData.GetLength(), 2471, NULL );
		if ( nSentBytes > 0 )
		{
			Sleep ( 1000 );
			cout << "Sent UDP broadcast data " << nSentBytes << " bytes." << endl;
		}
		else
		{
			DWORD dwLastError = GetLastError();
			if ( (nSentBytes == 0 && dwLastError != NO_ERROR) || (SOCKET_ERROR == nSentBytes && dwLastError == WSAEWOULDBLOCK) )
			{
				cout << "None data can sent" << endl;
				Sleep ( 1000 );
			}
			else
			{
				cout << "Peer disconnect. " << T2A(hwFormatMessage(dwLastError)) << endl;
				break;
			}
		}
	}

	cout << "Proc_BroadcastSend() thread exit" << endl;
	return TRUE;
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// 初始化 MFC 并在失败时显示错误
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// TODO: 更改错误代码以符合您的需要
		_tprintf(_T("错误: MFC 初始化失败\n"));
		nRetCode = 1;
	}
	else
	{
		cout << NOTE_CHwSocket << endl;
		if ( argc > 1 && lstrcmpi(argv[1], _T("-s") ) == 0 )
			g_bSendBroadcastData = TRUE;

		WSADATA wsaData;
		if( WSAStartup( MAKEWORD(2,0), &wsaData) != 0)
			AfxMessageBox ( _T("WSAStartup() failed") );

		m_hEvtEndModule = ::CreateEvent ( NULL, TRUE, FALSE, NULL );
		if ( g_bSendBroadcastData )
		{
			cout << "Broadcast sending. Press <ENTER> to exit ..." << endl;
			CreateThread ( NULL, 0, ::Proc_BroadcastSend, NULL, 0, NULL );
		}
		else
		{
			cout << "Broadcast receiving. Press <ENTER> to exit ..." << endl;
			CreateThread ( NULL, 0, ::Proc_BroadcastRecv, NULL, 0, NULL );
		}
		
		getchar ();

		SetEvent ( m_hEvtEndModule );
		HwSocket_BroadcastRecv.Close ();
		HwSocket_BroadcastSend.Close ();
		Sleep ( 2000 );

		WSACleanup();

		cout << "System end !" << endl;
		system ( "pause" );

	}

	return nRetCode;
}

⌨️ 快捷键说明

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