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