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

📄 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()
{
	WSADATA wsaData;
	char szOut[128];

	if(WSAStartup(0x0202,&wsaData)!=0)
//		if(WSAStartup(0x0200,&wsaData)!=0)
//			if(WSAStartup(0x0100,&wsaData)!=0)
			{
				sprintf(szOut,"WSAStartup Error Code :%d",h_errno);
				MessageBox(NULL,"wsastartup error","",MB_OK);
			}

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

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

/*	if (connect(m_sMultSock,(const struct sockaddr*)&m_MultAddr,sizeof(m_MultAddr))==SOCKET_ERROR){
		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::Close()
{  struct ip_mreq mreq;
	char	szOut[128];

	if(m_sMultSock!=INVALID_SOCKET){
		mreq.imr_multiaddr=m_MultAddr.sin_addr;
		mreq.imr_interface.s_addr=ADDR_ANY;
		if(setsockopt(m_sMultSock,IPPROTO_IP,IP_DROP_MEMBERSHIP,
			(char*)&mreq,sizeof(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 nlen=0;
	return 	 recvfrom(m_sMultSock,(char *)lpBuf,
		iSize,0,NULL,NULL);


}

⌨️ 快捷键说明

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