⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multisock_s.cpp

📁 组播网络程序测试,对于学习组播技术有帮助
💻 CPP
字号:
// MultiSock.cpp: implementation of the CMultiSock class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MultiSock_s.h"
//#include "MyMServerClient.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMultiSock::CMultiSock()
{
  sockCM=m_sMultSock = INVALID_SOCKET;

}

CMultiSock::~CMultiSock()
{
 
}

int CMultiSock::Startup(SOCKADDR_IN myAddr, SOCKADDR_IN multiAddr)
{
	
    int opt,ret;
	BOOL fFlag;
	struct ip_mreq mreq;
	char szOut[128];

	// create socket
	if((m_sMultSock=socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)
	{
		sprintf(szOut,"Create socket error code: %d.",h_errno);
		ret=-1;
		goto errend;
	}

	// reuse addr & port
	opt = TRUE;
	if (setsockopt(m_sMultSock,SOL_SOCKET,SO_REUSEADDR,
		(char*)&opt,sizeof(opt))==SOCKET_ERROR ){       //Set the port to reuse
		sprintf(szOut,"Setsockopt to Reuseaddr error code: %d.",h_errno);
		ret=-1;
		goto errend;
	}

	//bind the socket
	if(bind(m_sMultSock,(LPSOCKADDR)&myAddr,sizeof(myAddr))==SOCKET_ERROR){
		sprintf(szOut,"Bind the socket error code: %d.",h_errno );
		ret=-1;
		goto errend;
	}

	//add to the multcast address
	memcpy(&m_MultAddr,&multiAddr,sizeof(SOCKADDR_IN));

	memcpy(&mreq.imr_multiaddr,&m_MultAddr.sin_addr,sizeof(long));
	memcpy(&mreq.imr_interface,&myAddr.sin_addr,sizeof(long));
	if(setsockopt(m_sMultSock,IPPROTO_IP,IP_ADD_MEMBERSHIP,
		(char*)&mreq,sizeof(mreq))==SOCKET_ERROR){
		sprintf(szOut,"Setsockopt to add multcast address error code: %d.",h_errno);
		ret=-1;
		goto errend;
	}
	opt = 1;
	if (setsockopt(	m_sMultSock,
					IPPROTO_IP,
					IP_MULTICAST_TTL,
					(const char*)&opt,
					sizeof(opt))==SOCKET_ERROR){
		ret = WSAGetLastError();
		goto errend;
					}

	//set the send/recv buf
	opt = UDP_BUF_LEN;
	if(setsockopt(m_sMultSock,SOL_SOCKET,SO_SNDBUF,(char*)&opt,sizeof(opt))==SOCKET_ERROR){
		sprintf(szOut,"Setsockopt to set send buffer error code: %d.",h_errno);
		ret=-1;
		goto errend;
	}

	if( setsockopt(m_sMultSock,SOL_SOCKET,SO_RCVBUF,(char*)&opt,sizeof(opt))==SOCKET_ERROR){
		sprintf(szOut,"Setsockopt to set recv buffer error code: %d ",h_errno);
		ret=-1;
		goto errend;
	}

	return 0;
errend:
	Close();
	return ret;


}

int CMultiSock::SendData(LPVOID lpBuf, int iSize)
{   
	TRACE("ss\n");
  return sendto(	m_sMultSock,
					(char*)lpBuf,
					iSize,
					0,
					(const struct sockaddr*)&m_MultAddr,
					sizeof(m_MultAddr)); 
/*	return  send(m_sMultSock,
			(char*)lpBuf,
			iSize,
			0);*/
//	return nll;
}

int CMultiSock::Close()
{  //struct ip_mreq mreq;
	char	szOut[128];

	if(m_sMultSock!=INVALID_SOCKET){
	//	mreq.imr_multiaddr=m_MultAddr.sin_addr;
	//	mreq.imr_interface=myHostAddr.sin_addr;//ADDR_ANY;
		if(sockCM==INVALID_SOCKET){
           if(setsockopt(m_sMultSock,IPPROTO_IP,IP_DROP_MEMBERSHIP,
			(char*)&m_mreq,sizeof(m_mreq))==SOCKET_ERROR){
			sprintf(szOut,"Drop out the multcast addr error code:%d",h_errno);
			//OutputDebugString(szOut);
					}  
		}// sock cm
		else
           closesocket(sockCM);   
 	
		closesocket(m_sMultSock);
	}

	sockCM=INVALID_SOCKET;
	m_sMultSock = INVALID_SOCKET;
	return 0;
}

int CMultiSock::Startup(SOCKADDR_IN myAddr, SOCKADDR_IN multiAddr, int nTTL)
{ 
    int opt,ret;
	int nRet;
	BOOL fFlag;
	struct ip_mreq mreq;
	char szOut[128];
    
	// create socket
	if((m_sMultSock=socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)
	{
		sprintf(szOut,"Create socket error code: %d.",h_errno);
		ret=-1;
		goto errend;
	}

	// reuse addr & port
	opt = TRUE;
	if (setsockopt(m_sMultSock,SOL_SOCKET,SO_REUSEADDR,
		(char*)&opt,sizeof(opt))==SOCKET_ERROR ){       //Set the port to reuse
		sprintf(szOut,"Setsockopt to Reuseaddr error code: %d.",h_errno);
		ret=-1;
		goto errend;
	}

	//bind the socket
	if(bind(m_sMultSock,(LPSOCKADDR)&myAddr,sizeof(myAddr))==SOCKET_ERROR){
		sprintf(szOut,"Bind the socket error code: %d.",h_errno );
		ret=-1;
		goto errend;
	}

     if(connect(m_sMultSock,(struct sockaddr*)&multiAddr,sizeof(multiAddr))
		==SOCKET_ERROR){
        sprintf(szOut,"connect  error code: %d.",h_errno );
		ret=-1;
		goto errend;
	 } 
	//add to the multcast address
	memcpy(&m_MultAddr,&multiAddr,sizeof(SOCKADDR_IN));
    memcpy(&myHostAddr,&myAddr,sizeof(SOCKADDR_IN));
   
    mreq.imr_multiaddr.s_addr=m_MultAddr.sin_addr.s_addr;
    mreq.imr_interface.s_addr=myAddr.sin_addr.s_addr;
	 
	memcpy(&m_mreq,&mreq,sizeof(mreq));
	if(setsockopt(m_sMultSock,IPPROTO_IP,IP_ADD_MEMBERSHIP,
		(char*)&mreq,sizeof(mreq))==SOCKET_ERROR){
		sprintf(szOut,"Setsockopt to add multcast address error code: %d.",h_errno);
		ret=-1;
		goto errend;
	}
	opt = nTTL;
	if (setsockopt(	m_sMultSock,
					IPPROTO_IP,
					IP_MULTICAST_TTL,
					(const char*)&opt,
					sizeof(opt))==SOCKET_ERROR){
		ret = WSAGetLastError();
		goto errend;
					}

	//set the send/recv buf
	opt = UDP_BUF_LEN;
	if(setsockopt(m_sMultSock,SOL_SOCKET,SO_SNDBUF,(char*)&opt,sizeof(opt))==SOCKET_ERROR){
		sprintf(szOut,"Setsockopt to set send buffer error code: %d.",h_errno);
		ret=-1;
		goto errend;
	}

	if( setsockopt(m_sMultSock,SOL_SOCKET,SO_RCVBUF,(char*)&opt,sizeof(opt))==SOCKET_ERROR){
		sprintf(szOut,"Setsockopt to set recv buffer error code: %d ",h_errno);
		ret=-1;
		goto errend;
	}

    fFlag = FALSE;
	nRet = setsockopt(m_sMultSock, IPPROTO_IP, 
		IP_MULTICAST_LOOP, (char *)&fFlag, 
		sizeof(fFlag) );
	if ( nRet == SOCKET_ERROR){
		ret=-1;
		goto errend;
	}

	return 0;
errend:
	AfxMessageBox(szOut);
	Close();
	return ret;
}
int CMultiSock::Startup_(SOCKADDR_IN myAddr, SOCKADDR_IN multiAddr, int nTTL)
{   int err; 
	int opt,ret;
	char szOut[128];
	int nMCastTTL = nTTL;
	unsigned long cbRet;
	BOOL fReuseAddr = TRUE,bFlag;

	m_sMultSock =  WSASocket(AF_INET, SOCK_DGRAM, 0, (LPWSAPROTOCOL_INFO)NULL, 0,
					WSA_FLAG_MULTIPOINT_C_LEAF| WSA_FLAG_MULTIPOINT_D_LEAF);

	if (m_sMultSock==INVALID_SOCKET&&WSAGetLastError()==WSANOTINITIALISED)
	{
	 ret=-1;
	 goto errend;
	}	

 	opt = TRUE;
	if (setsockopt(m_sMultSock,SOL_SOCKET,SO_REUSEADDR,
		(char*)&opt,sizeof(opt))==SOCKET_ERROR ){       //Set the port to reuse
		sprintf(szOut,"Setsockopt to Reuseaddr error code: %d.",h_errno);
		ret=-1;
		goto errend;
	}

	//bind the socket
	if(bind(m_sMultSock,(LPSOCKADDR)&myAddr,sizeof(myAddr))==SOCKET_ERROR){
		sprintf(szOut,"Bind the socket error code: %d.",h_errno );
		ret=-1;
		goto errend;
	}
	
	
	/* set the IP TTL */
    	memcpy(&m_MultAddr,&multiAddr,sizeof(SOCKADDR_IN));
		err =WSAIoctl (m_sMultSock, SIO_MULTICAST_SCOPE, &nMCastTTL, 
			sizeof (nMCastTTL),NULL, 0, &cbRet, NULL, NULL);
		if (err!=0){
			err = WSAGetLastError();
			ret=-1;
			goto errend;
		}
	

		/* 禁止loopback,不给本机发送 */
		bFlag = FALSE;
	err = WSAIoctl (m_sMultSock,	SIO_MULTIPOINT_LOOPBACK, &bFlag, 
		sizeof (bFlag), NULL, 0, &cbRet, NULL, NULL);
	
	
	sockCM = WSAJoinLeaf(m_sMultSock,(PSOCKADDR)&multiAddr,
			sizeof(multiAddr),NULL,NULL,NULL,NULL,JL_BOTH);
		if (sockCM==INVALID_SOCKET){
			err = WSAGetLastError();
		    ret=-1;
			AfxMessageBox("socket error");
			goto errend;
		}
		
		opt = UDP_BUF_LEN;
	if(setsockopt(m_sMultSock,SOL_SOCKET,SO_SNDBUF,(char*)&opt,sizeof(opt))==SOCKET_ERROR){
		sprintf(szOut,"Setsockopt to set send buffer error code: %d.",h_errno);
		ret=-1;
		goto errend;
	}

	if( setsockopt(m_sMultSock,SOL_SOCKET,SO_RCVBUF,(char*)&opt,sizeof(opt))==SOCKET_ERROR){
		sprintf(szOut,"Setsockopt to set recv buffer error code: %d ",h_errno);
		ret=-1;
		goto errend;
	}
		return 0;
errend:
	closesocket(m_sMultSock);
	return ret;
	return err;
}

int CMultiSock::Startup(char *strMultiIP, DWORD dwMultiPort, char *strLocalIP, DWORD dwLocalPort, int nTTL)
{ SOCKADDR_IN m_HostAddr,  multiAddr;
  m_HostAddr.sin_family=multiAddr.sin_family=AF_INET;

  if(strlen(strLocalIP)==0)
  m_HostAddr.sin_addr.s_addr=INADDR_ANY;
  else
  m_HostAddr.sin_addr.s_addr=inet_addr(strLocalIP);


    //m_HostAddr.sin_addr.s_addr=INADDR_ANY;
  multiAddr.sin_addr.s_addr=inet_addr(strMultiIP);


  multiAddr.sin_port=dwMultiPort;
  
  m_HostAddr.sin_port=dwLocalPort;
  
 return Startup(m_HostAddr,multiAddr,nTTL);
 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -