www.pudn.com > win向win组播.rar > BroadCast.cpp


// BroadCast.cpp: implementation of the CBroadCast class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "BroadCast.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
#define RECV_IP_ADDR "234.25.8.7" 
#define SEND_IP_ADDR "234.25.8.6" 
#define IP_OPTIONS          1           /* set/get IP per-packet options    */ 
#define IP_MULTICAST_IF     2           /* set/get IP multicast interface   */ 
#define IP_MULTICAST_TTL    3           /* set/get IP multicast timetolive  */ 
#define IP_MULTICAST_LOOP   4           /* set/get IP multicast loopback    */ 
#define IP_ADD_MEMBERSHIP   5           /* add  an IP group membership      */ 
#define IP_DROP_MEMBERSHIP  6           /* drop an IP group membership      */ 
#define IP_TTL              7           /* set/get IP Time To Live          */ 
#define IP_TOS              8           /* set/get IP Type Of Service       */ 
#define IP_DONTFRAGMENT     9           /* set/get IP Don't Fragment flag   */ 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CBroadCast::CBroadCast() 
{ 
} 
long CBroadCast::Init(long port, long lServices_Type) 
{ 
	WORD wVersionRequested; 
	WSADATA wsaData; 
	int err;  
	int on = 1; 
	int optval; 
	char ip_str[16]; 
	SOCKADDR_IN addrDest; 
 
	m_Port=port; 
 
	wVersionRequested = MAKEWORD(2,2);  
	err = WSAStartup( wVersionRequested, &wsaData ); 
	if ( err != 0 )  
	{		 
		//AfxMessageBox("初始化失败"); 
		return -1; 
	} 
	 
	m_Sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED);	 
	if(m_Sock==INVALID_SOCKET) 
	{ 
		//AfxMessageBox("初始化失败"); 
		return -1; 
	} 
	if(setsockopt(m_Sock,SOL_SOCKET,SO_REUSEADDR,(char*)&on,sizeof(int))==SOCKET_ERROR) 
	{ 
		//int x=WSAGetLastError(); 
		closesocket (m_Sock);		 
		//AfxMessageBox("初始化失败"); 
		return -1; 
	} 
	gethostip(ip_str); 
 
	addrDest.sin_family=AF_INET; 
	addrDest.sin_port=htons((unsigned short)m_Port); 
	//addrDest.sin_addr.S_un.S_addr=htonl(INADDR_ANY); 
	addrDest.sin_addr.S_un.S_addr=inet_addr(ip_str); 
 
	if(SOCKET_ERROR==bind(m_Sock,(SOCKADDR*)&addrDest,sizeof(SOCKADDR))) 
	{ 
		shutdown(m_Sock,FD_CLOSE); 
		closesocket(m_Sock); 
		//AfxMessageBox("初始化失败"); 
		return -1; 
	} 
	 
	optval=64; 
	if(setsockopt(m_Sock,IPPROTO_IP,IP_MULTICAST_TTL,(char*)&optval,sizeof(int))==SOCKET_ERROR) 
	{ 
		//int x=WSAGetLastError(); 
		closesocket (m_Sock);		 
		//AfxMessageBox("初始化失败"); 
		return -1; 
	} 
	if(setsockopt(m_Sock,IPPROTO_IP,IP_MULTICAST_LOOP,(char*)&optval,sizeof(optval))==SOCKET_ERROR) 
	{ 
		//int x=WSAGetLastError(); 
		closesocket (m_Sock);		 
		//AfxMessageBox("初始化失败"); 
		return -1; 
	} 
 
	m_remote.sin_family=AF_INET; 
	m_remote.sin_port=htons((unsigned short)m_Port); 
	m_remote.sin_addr.s_addr=inet_addr("234.25.8.7"); 
 
	//WSAJoinLeaf(m_Sock,(SOCKADDR*)&m_remote,sizeof(m_remote),NULL,NULL,NULL,NULL,JL_RECEIVER_ONLY); 
	WSAJoinLeaf(m_Sock,(SOCKADDR*)&m_remote,sizeof(m_remote),NULL,NULL,NULL,NULL,JL_BOTH); 
 
	return 0; 
} 
 
CBroadCast::~CBroadCast() 
{ 
	closesocket(m_Sock); 
} 
long CBroadCast::gethostip(char * ip_str) 
{ 
	char name[1024]; 
	int len=1024; 
	struct hostent * ptr; 
	long ret; 
 
	ret = gethostname(name,len); 
 
	if ( ret == 0 ) { 
		ptr = gethostbyname(name); 
 
		if ( ptr != NULL ) { 
			strcpy(ip_str,inet_ntoa(* ( struct in_addr * ) (void *)ptr->h_addr_list[0])); 
			return 0; 
		} 
	}  
	return -1; 
} 
long  CBroadCast::RecvBroadCast(char *recvbuf)  // thread data 
{	 
	int recvsize; 
 
	recvsize=recvfrom(m_Sock,(char *)recvbuf,MAX_LEN,0,NULL,NULL); 
	if ( recvsize >= 0 ) {		 
	} 
 
	return recvsize; 
} 
long  CBroadCast::SendBroadCast(char *sendbuf,long len)  // thread data 
{	 
	int sendsize; 
	 
	sendsize=sendto(m_Sock,(char *)sendbuf,len,0,(struct sockaddr *)&m_remote,sizeof(m_remote)); 
	if ( sendsize >= 0 ) {		 
	} 
	 
	return sendsize; 
}