You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.7 KiB
C++
112 lines
2.7 KiB
C++
#include "stdafx.h"
|
|
#include "MUDP.h"
|
|
#include "Mmc.h"
|
|
CMUDP::CMUDP()
|
|
{
|
|
memset( m_strBuffer, 0, sizeof( m_strBuffer ) );
|
|
m_fun=NULL;
|
|
if (!AfxSocketInit()){
|
|
MessageBox(NULL,_T("网络组播套接字初始化失败"),"....", MB_OK | MB_ICONSTOP);
|
|
}
|
|
}
|
|
|
|
CMUDP::~CMUDP()
|
|
{
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMulticastSocket member functions
|
|
|
|
void CMUDP::OnReceive( int nErrorCode )
|
|
{
|
|
memset( m_strBuffer, 0, 32000 );
|
|
|
|
int nDataNum = ReceiveFrom( m_strBuffer, 32000, m_strSendersIP, m_nSendersPort );
|
|
|
|
if ( nDataNum == SOCKET_ERROR )
|
|
{
|
|
AfxMessageBox( "网络组播接收数据错误!" );
|
|
}
|
|
else
|
|
{
|
|
if (m_fun)
|
|
{
|
|
m_fun(m_strBuffer,nDataNum,m_param);
|
|
}
|
|
}
|
|
|
|
CAsyncSocket::OnReceive( nErrorCode );
|
|
}
|
|
|
|
BOOL CMUDP::LeaveGroup()
|
|
{
|
|
if ( setsockopt( m_hSocket, IPPROTO_IP, IP_DROP_MEMBERSHIP, ( char FAR * ) &m_mrMReq, sizeof( m_mrMReq ) ) < 0 )
|
|
{
|
|
return FALSE;
|
|
}
|
|
Close(); // Close receving socket
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CMUDP::SendToY( const void *strMessage, int nSize )
|
|
{
|
|
if ( SendTo( strMessage, nSize, ( SOCKADDR * ) &m_saHostGroup, sizeof( SOCKADDR ), 0 ) == SOCKET_ERROR )
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
BOOL CMUDP::InitGroup( CString GroupIP, UINT nGroupPort, UINT nTTL, BOOL bLoopback )
|
|
{
|
|
int nLoopBack = ( int ) bLoopback;
|
|
|
|
if ( !Create( nGroupPort, SOCK_DGRAM, FD_READ|FD_WRITE ) ){
|
|
Close();
|
|
return FALSE;
|
|
}
|
|
|
|
m_mrMReq.imr_multiaddr.s_addr = inet_addr(GroupIP );
|
|
m_mrMReq.imr_interface.s_addr = htons( INADDR_ANY );
|
|
|
|
memset( &m_saHostGroup, 0, sizeof( m_saHostGroup ) );
|
|
m_saHostGroup.sin_family = AF_INET;
|
|
m_saHostGroup.sin_addr.s_addr = inet_addr( GroupIP );
|
|
m_saHostGroup.sin_port = htons( ( USHORT ) nGroupPort );
|
|
|
|
BOOL bMultipleApps = TRUE;
|
|
if(SetSockOpt( SO_REUSEADDR, ( void * ) &bMultipleApps, sizeof( BOOL ), SOL_SOCKET ) < 0){
|
|
AfxMessageBox( "网络组播设置失败--1" );
|
|
Close();
|
|
return FALSE;
|
|
}
|
|
if (SetSockOpt( IP_MULTICAST_TTL, &nTTL, sizeof( int ), IPPROTO_IP ) < 0 ){
|
|
AfxMessageBox( "网络组播设置失败--2" );
|
|
Close();
|
|
return FALSE;
|
|
}
|
|
if (SetSockOpt(IP_MULTICAST_LOOP, &nLoopBack, sizeof( int ), IPPROTO_IP ) < 0 ){
|
|
AfxMessageBox( "网络组播设置失败--3" );
|
|
Close();
|
|
return FALSE;
|
|
}
|
|
if(SetSockOpt(IP_ADD_MEMBERSHIP,( char FAR * ) &m_mrMReq,sizeof( m_mrMReq ),IPPROTO_IP) < 0){
|
|
AfxMessageBox( "网络组播设置失败--4" );
|
|
Close();
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CMUDP::SetReadCallBack(MulticastCALLBACK fun, LPVOID lp)
|
|
{
|
|
m_fun=fun;
|
|
m_param = lp;
|
|
}
|
|
|
|
|