?? tbroadcast_dllhwsocket.cpp
字號(hào):
// TBroadcast_dllHwSocket.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#include "stdafx.h"
#include "TBroadcast_dllHwSocket.h"
// 唯一的應(yīng)用程序?qū)ο?
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廣播數(shù)據(jù)
//
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;
}
//
// 發(fā)送UDP廣播數(shù)據(jù)
//
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 并在失敗時(shí)顯示錯(cuò)誤
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改錯(cuò)誤代碼以符合您的需要
_tprintf(_T("錯(cuò)誤: 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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -