📄 broadsocket.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 + -