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

📄 broadsocket.cpp

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

#include "stdafx.h"
#include "DVB_IPE.h"
#include "BroadSocket.h"
#include <winsock2.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

CBroadSocket::CBroadSocket()
{
 m_sSocket=INVALID_SOCKET;
 fromlen = sizeof(struct sockaddr_in);
}

CBroadSocket::~CBroadSocket()
{
 Close();
}

int CBroadSocket::CreateSocket(unsigned long dwSelfIPAddr,short sPort)
{   	int err; 
	
	m_sSocket = WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,NULL,0,
							WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);
	if (m_sSocket==INVALID_SOCKET&&WSAGetLastError()==WSANOTINITIALISED){
		WORD wVersionRequested;
		WSADATA wsaData;

		wVersionRequested = MAKEWORD(2,0);
		err = WSAStartup(wVersionRequested,&wsaData);
		if (err==0){
			if (LOBYTE(wsaData.wVersion)==2&&HIBYTE(wsaData.wVersion)==0){
				m_sSocket = WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,NULL,0,
							   WSA_FLAG_OVERLAPPED|WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);
				if (m_sSocket==INVALID_SOCKET){
					err = WSAGetLastError();
					return err;
				}
				goto SOCKET_SUCCESS;
			}
			else{
				WSACleanup();
				return WSAVERNOTSUPPORTED;
			}
		}
		return err;
	}

SOCKET_SUCCESS:
	BOOL fReuseAddr = TRUE;

	do{
		err = setsockopt(m_sSocket,SOL_SOCKET,SO_REUSEADDR,(char*)&fReuseAddr,sizeof(int));
		if (err!=0){
			err = WSAGetLastError();
			break;
		}
		m_MyAddr.sin_family = AF_INET;
		m_MyAddr.sin_port = htons(sPort);
		//if (dwSelfIPAddr){
		//	m_MyAddr.sin_addr.s_addr = dwSelfIPAddr;
	//	}
	//	else{
			m_MyAddr.sin_addr.s_addr = INADDR_ANY;
	//	}
		err = bind(m_sSocket,(struct sockaddr*)&m_MyAddr,sizeof(m_MyAddr));
		if (err!=0){
			err = WSAGetLastError();
			break;
		}

		int bEnable = TRUE;
		err = setsockopt(m_sSocket,SOL_SOCKET,SO_BROADCAST,(const char*)&bEnable,sizeof(int));
		if (err!=0){
			err = WSAGetLastError();
			break;
		}

		m_TheirAddr.sin_family = AF_INET;
		m_TheirAddr.sin_port = htons(sPort);
		m_TheirAddr.sin_addr.s_addr = INADDR_BROADCAST;
		return 0;
	}while (FALSE);

	return -1;

}

void CBroadSocket::Close()
{
	if(m_sSocket!=INVALID_SOCKET)
		closesocket(m_sSocket);
	m_sSocket=INVALID_SOCKET;
}

int CBroadSocket::SendData(LPVOID lpBuf, int iSize)
{
 return sendto(	m_sSocket,
					(char*)lpBuf,
					iSize,
					0,
					(const struct sockaddr*)&m_TheirAddr,
					sizeof(m_TheirAddr));
}

SOCKET CBroadSocket::GetSocket()
{
 return m_sSocket;
}

int CBroadSocket::RecvData(LPVOID lpBuf, int iSize)
{
 return  recvfrom(	m_sSocket,
						 (char*)lpBuf,
						 iSize,
						 0,
						 (struct sockaddr *)&from,
						 (int *)&fromlen);
}

int CBroadSocket::StartUp(long lPort)
{   BOOL bOptval=TRUE,fOption = TRUE;
	long opt;
	int err;
	int bEnable = TRUE;
 	m_MyAddr.sin_family = AF_INET;
	m_MyAddr.sin_port = htons(lPort);
	m_MyAddr.sin_addr.s_addr = INADDR_ANY;

	m_TheirAddr.sin_family = AF_INET;
	m_TheirAddr.sin_port = htons(lPort);
	m_TheirAddr.sin_addr.s_addr = INADDR_BROADCAST;

	  if((m_sSocket=socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)
	  { AfxMessageBox("Init the bserver CMD socket Error!!");
      goto Erro_exit;
	  }
      err=setsockopt(m_sSocket,SOL_SOCKET,SO_REUSEADDR,(const char*)&fOption,sizeof(int));
      if(err!=0){
		  goto Erro_exit;
      }

	  err = bind(m_sSocket,(struct sockaddr*)&m_MyAddr,sizeof(m_MyAddr));
      if(err!=0){
		  goto Erro_exit;
      }
	  opt=UDP_BUF_LEN;
	  Sleep(10);
      err=setsockopt(m_sSocket,SOL_SOCKET,SO_BROADCAST,(const char*)&bEnable,sizeof(int));
	  if(err!=0){
		  goto Erro_exit;
      }
	  err=setsockopt(m_sSocket,SOL_SOCKET,SO_SNDBUF,(char*)&opt,sizeof(opt));
      if(err!=0){
		  goto Erro_exit;
      }
	  err=setsockopt(m_sSocket,SOL_SOCKET,SO_RCVBUF,(char*)&opt,sizeof(opt)); 
       if(err!=0){
		  goto Erro_exit;
      }
	  return 0;
Erro_exit:
	  return -1;

}

⌨️ 快捷键说明

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