在进行广播消息时,跨二個网段能不能完成广播?192.168.*.*的网段下。。
目前有做一个测试程式进行一个网段来广播讯息,现在的需求是至少跨两个网段来进行广播,请问下怎么实现跨两个网段来做到广播消息的?
以下是我做的一个针对一个网段进行简单的广播的源码:
#include "stdafx.h"
#include "CBroadCast.h"
#include <winsock2.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "WS2_32.lib")
CBroadCast::CBroadCast()
{
memset(m_szBroadCastAddr,0,16);
m_iServerPort = 0;
m_lServerAddr = 0;
memset(m_BroadCastMsg, 0, 64);
isAlive = false;
m_iBroadCastPort = 0;
}
CBroadCast::~CBroadCast()
{
stop();
}
void CBroadCast::stop()
{
isAlive = false;
}
bool CBroadCast::InitSocket()
{
//啟動SOCKET庫,版本為2.0
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 0 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
cout<<"Socket2.0初始化失敗,Exit!";
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 )
{
WSACleanup();
return 0;
}
if (m_iBroadCastPort > 0)
{
struct sockaddr_in sockaddr_broadcast;
if( ( m_socket_bc = socket(AF_INET,SOCK_DGRAM,0)) < 0 )
{
return false;
}
memset(&sockaddr_broadcast,0,sizeof(sockaddr_broadcast));
sockaddr_broadcast.sin_family = AF_INET;
sockaddr_broadcast.sin_addr.s_addr = inet_addr(m_szBroadCastAddr);
sockaddr_broadcast.sin_port = htons(m_iBroadCastPort);
int broadcast = 1;
//socklen_t len = sizeof(int);
int len = sizeof(int);
if( setsockopt(m_socket_bc,
SOL_SOCKET,
SO_BROADCAST,
(char *)&broadcast,len)< 0 )
{
perror("setsockopt error!\n");
return false;
}
}
return true;
}
void CBroadCast::start()
{
if( !InitSocket() )
{
return;
}
isAlive = true;
while(1)
{
CBroadCast * pBroadCast = (CBroadCast *)this;
struct sockaddr_in sockaddr_broadcast;
memset(&sockaddr_broadcast,'\0',sizeof(sockaddr_broadcast));
sockaddr_broadcast.sin_family = AF_INET;
sockaddr_broadcast.sin_addr.s_addr = inet_addr(pBroadCast->m_szBroadCastAddr);
sockaddr_broadcast.sin_port = htons(pBroadCast->m_iBroadCastPort);
cout<<"Begin BroadCast!"<<endl;
while( pBroadCast->isAlive)
{
int bclen;
bclen = strlen(pBroadCast->m_BroadCastMsg);
sendto(pBroadCast->m_socket_bc,
(const char *)pBroadCast->m_BroadCastMsg,
bclen,
0,
(struct sockaddr *)&sockaddr_broadcast,
sizeof(sockaddr_broadcast));
Sleep(pBroadCast->m_uiHeartBeat);
}
return;
}
}