#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; }