tudp_dllhwsocket.cpp

来自「这里将 Socket APIs 封装成一个类似 CAsyncSocket 接口的」· C++ 代码 · 共 163 行

CPP
163
字号
// TUDP_dllHwSocket.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "TUDP_dllHwSocket.h"


// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

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_UdpRecv;
DWORD WINAPI Proc_UdpRecv(
  LPVOID lpParameter   // thread data
)
{
	USES_CONVERSION;
	if ( !HwSocket_UdpRecv.Create (2471, SOCK_DGRAM) )
	{
		cout << "Create socket 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_UdpRecv.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_UdpRecv() thread exit" << endl;
	return TRUE;
}

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

	int nCount = 0;
	CString csSendData;
	// 等待客户端连接
	while ( ::WaitForSingleObject ( m_hEvtEndModule, 0 ) != WAIT_OBJECT_0 )
	{
		csSendData.Format ( _T("UDP data line.%d"), nCount );
		int nSentBytes = HwSocket_UdpSend.SendTo ( T2A(csSendData), csSendData.GetLength(), 2471, _T("127.0.0.1") );
		if ( nSentBytes > 0 )
		{
			Sleep ( 1000 );
			cout << "Sent UDP 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_UDPSend() 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;

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

		m_hEvtEndModule = ::CreateEvent ( NULL, TRUE, FALSE, NULL );
		CreateThread ( NULL, 0, ::Proc_UdpRecv, NULL, 0, NULL );
		CreateThread ( NULL, 0, ::Proc_UDPSend, NULL, 0, NULL );
		
		cout << "System start OK. Press <ENTER> to exit ..." << endl;
		getchar ();

		SetEvent ( m_hEvtEndModule );
		HwSocket_UdpRecv.Close ();
		HwSocket_UdpSend.Close ();
		Sleep ( 2000 );

		WSACleanup();

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

	}

	return nRetCode;
}

⌨️ 快捷键说明

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