在进行广播消息时,跨二個网段能不能完成广播?192.168.*.*的网段下。。

feng2008519 2011-10-24 09:56:00
目前有做一个测试程式进行一个网段来广播讯息,现在的需求是至少跨两个网段来进行广播,请问下怎么实现跨两个网段来做到广播消息的?
以下是我做的一个针对一个网段进行简单的广播的源码:
#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;
}
}
...全文
259 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-10-25
  • 打赏
  • 举报
回复
这是多播。
飞天御剑流 2011-10-25
  • 打赏
  • 举报
回复
这个不是源码这一层做的事情,需要在路由器上做一个子网汇聚,然后你的代码就像单一网段广播一样,对汇聚后的子网网络广播地址发送消息。
追求执着 2011-10-25
  • 打赏
  • 举报
回复
feng2008519 2011-10-25
  • 打赏
  • 举报
回复
无人问津。。。求帮助。。
老马何以识途 2011-10-25
  • 打赏
  • 举报
回复
你只能定向发包了,路由器不归你的程序管啊。
feng2008519 2011-10-25
  • 打赏
  • 举报
回复
int _tmain(int argc, _TCHAR* argv[])
{
CBroadCast m_bc;
m_bc.SetBroadCastAddr("192.168.1.255");
m_bc.SetBroadCastPort(18888);
m_bc.SetHeartBeat(1000);
m_bc.SetBroadCastMsg("BroadCast.....test msg!");
m_bc.start();
return 0;
}


像这样的话可以进行一个网段的广播。。现在需要的是二个网段进行广播。。。。
就是说设置为:
m_bc.SetBroadCastAddr("192.168.2.255");如果设定192.168.2.255就是对2的整个网段广播。
现在就需要做成这样。。应该怎么处理。。求解。。高人指点,很急。。。。

辰岡墨竹 2011-10-25
  • 打赏
  • 举报
回复
应该是不能,只要过了一个路由器,广播就被截止了。
feng2008519 2011-10-25
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "CBroadCast.h"

int _tmain(int argc, _TCHAR* argv[])
{
CBroadCast m_bc;
m_bc.SetBroadCastAddr("192.168.1.150");
m_bc.SetBroadCastPort(18888);
m_bc.SetHeartBeat(1000);
m_bc.SetBroadCastMsg("BroadCast.....test msg!");
m_bc.start();
return 0;
}

目前只能做到一个网段进行广播。。。即m_bc.SetBroadCastAddr("192.168.1.*");//*表示任意值

现在需要做到二个网段可以做广播。。。所以在m_bc.SetBroadCastAddr("192.168.1.150");
中设置时可以设置为m_bc.SetBroadCastAddr("192.168.*.*");//*表示任意值

需要在二个网段进行广播,请大虾指点应该怎么做才能达到这种效果。。。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧