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

📄 multsock.cpp

📁 组播发送测试网络程序,客户端
💻 CPP
字号:
// MultiSock.cpp: implementation of the CMultiSock class.
//
//////////////////////////////////////////////////////////////////////

#include "Winsock2.h"
#include <ws2tcpip.h>
#include "MultSock.h"
//#include "myMserverClient.h"

#include "stdio.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

CMultiSock::CMultiSock()
{

	m_sMultSock = INVALID_SOCKET;
}

CMultiSock::~CMultiSock()
{
	Close();
//	WSACleanup(); 
}

int CMultiSock::Startup(SOCKADDR_IN myAddr, SOCKADDR_IN multiAddr)
{
	
    int opt,ret;
	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;
	}

	  
	//set the send/recv buf
	opt = 128*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;
	}

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

}



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;
		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);
		}
		closesocket(m_sMultSock);
	}

	m_sMultSock = INVALID_SOCKET;
	return 0;

}
int CMultiSock::RecvData(LPVOID lpBuf, int iSize)
{      /* int nAddrLen;
		 struct sockaddr_in fromAddr;
		 nAddrLen = sizeof(fromAddr);*/
	return 	 recv(m_sMultSock,(char *)lpBuf,
		iSize,0);
 	/*return 	 recvfrom(m_sMultSock,(char *)lpBuf,
		iSize,0,NULL,NULL);
   */
}

⌨️ 快捷键说明

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