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

📄 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::SendData(LPVOID lpBuf, int iSize)
{   
//	TRACE("ss\n");
	WSABUF stWSABuf;
	DWORD cbRet;

	if(!m_bisConnected){
    stWSABuf.buf = (char*)lpBuf;
	stWSABuf.len = iSize;

	int nRet = WSASendTo (m_sMultSock, &stWSABuf, 1, &cbRet, 0,
			(struct sockaddr*)&m_MultAddr,  sizeof(struct sockaddr),
			NULL, NULL);
	if(nRet==SOCKET_ERROR) return -1;
	else return cbRet;
    /*return sendto(	m_sMultSock,
					(char*)lpBuf,
					iSize,
					0,
					(const struct sockaddr*)&m_MultAddr,
					sizeof(m_MultAddr));  */

	}
  

	else
 	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;
	 } 
	 m_bisConnected=true;
	//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(g_bIsAddMember){
	 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);
		AfxMessageBox(szOut);
		ret=-1;
		goto errend;
	} 
	// AfxMessageBox("add member");
	}
 
 
	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
    

	if(g_nSndBuf>=0){


	opt = g_nSndBuf*1024;
	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;
	}

   /* opt = g_nSndBuf*1024;
	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;
	}*/
	} // end set buffer

// get snd buffer
	opt=sizeof(int);
	if(getsockopt(m_sMultSock,SOL_SOCKET,SO_SNDBUF,
		   (char*)&g_nGetSndBuf,&opt)==SOCKET_ERROR){
		sprintf(szOut,"getsockopt to set send buffer error code: %d.",h_errno);
		ret=-1;
		goto errend;
	}


    fFlag = g_bIsLoopBack;
 	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,nRet; 
	int opt,ret;
	char szOut[128];
	int nMCastTTL = nTTL;
	unsigned long cbRet;
	BOOL fReuseAddr = TRUE,bFlag;

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

	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;
	}
	m_bisConnected=false;
	
	/* set the IP TTL */
    	memcpy(&m_MultAddr,&multiAddr,sizeof(SOCKADDR_IN));
		err =WSAIoctl (m_sMultSock, SIO_MULTICAST_SCOPE, &nMCastTTL, 
			sizeof (int),NULL, 0, &cbRet, NULL, NULL);
		if (err!=0){
			err = WSAGetLastError();
			ret=-1;
			goto errend;
		}
	

		/* 禁止loopback,不给本机发送 */
	bFlag =g_bIsLoopBack;
	nRet = WSAIoctl (m_sMultSock,	SIO_MULTIPOINT_LOOPBACK, &bFlag, sizeof (bFlag), 
			NULL, 0, &cbRet, NULL, NULL);

	if(g_bIsAddMember){
   	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;
		}
	//	AfxMessageBox("was jion");
	}
 
	if(g_nSndBuf>=0){
		
		opt =   g_nSndBuf*1024;;
	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;
	}*/
	}// end set buffer

		opt=sizeof(int);
	if(getsockopt(m_sMultSock,SOL_SOCKET,SO_SNDBUF,
		   (char*)&g_nGetSndBuf,&opt)==SOCKET_ERROR){
		sprintf(szOut,"getsockopt to set send buffer error code: %d.",h_errno);
		ret=-1;
		goto errend;
	}

		return 0;
errend:
	closesocket(m_sMultSock);
	return ret;
	 
}

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(strcmp(strLocalIP,"127.0.0.1")==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);
  //m_HostAddr.sin_addr.s_addr=INADDR_ANY;

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