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++

2 years ago
#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;
}