当前位置:  技术问答>linux和unix

使用ACE库为何局域网通讯OK,而广域网却不OK?

    来源: 互联网  发布时间:2016-09-26

    本文导语:  //服务器端 /////////////////////////////////////////////////////////////////////////////////////////////////////////// #define DEFAULT_MULTICAST_ADDR "224.0.0.1" //所有支持多播的主机,服务器在这个地址上监听所有的客户端上线消息 //多播接收器 cl...

//服务器端
///////////////////////////////////////////////////////////////////////////////////////////////////////////

#define DEFAULT_MULTICAST_ADDR "224.0.0.1" //所有支持多播的主机,服务器在这个地址上监听所有的客户端上线消息

//多播接收器
class CReceiver_Multicast
{
public:
CReceiver_Multicast(int port):
  mcast_addr_(port,DEFAULT_MULTICAST_ADDR)
  {
  // 预定多播
  if (mcast_dgram_.subscribe (mcast_addr_) == -1)
  {
  OutputDebugString("Error in subscribing to Multicast address n");
  }
  }
  ~CReceiver_Multicast()
  {
  //取消预定
  if(mcast_dgram_.unsubscribe()==-1)
  OutputDebugString("Error in unsubscribing from Mcast groupn");
  }

  //接收多播消息
  int recv(char* buf, size_t bufSize, DWORD dwTimeout_msec, ACE_INET_Addr& remote)
  {
  ACE_Time_Value tm(dwTimeout_msec/1000, (dwTimeout_msec%1000)*1000);
  return mcast_dgram_.recv (buf, bufSize, remote, 0, &tm);
  }

private:
ACE_INET_Addr mcast_addr_;
ACE_SOCK_Dgram_Mcast mcast_dgram_;
};

void CServer::Go()
{
char buf[1024]={0};
CReceiver_Multicast receiver(2000);//监视多播端口

m_EventStop = 0;
ACE_INET_Addr remote;
while(!m_EventStop)
{
//接收多播数据
int nRecv = receiver.recv(buf, sizeof(buf), 300, remote);
if(nRecv>0)
{
//do something
}
}
}

//客户端
/////////////////////////////////////////////////////////////////////////////////////////////////////

void CClient::Go()
{
ACE_INET_Addr local((u_short)0);
ACE_SOCK_Dgram data_gram(local);

data_gram.get_local_addr(local);
m_LsitenPort = local.get_port_number();

ACE_INET_Addr remote;
ACE_Time_Value timeout( Millisec2ACETime(60) );

static const char DEFAULT_MULTICAST_ADDR[] = "224.0.0.1"; 
ACE_INET_Addr server(2000, DEFAULT_MULTICAST_ADDR);//周知的服务器监听的多播地址及端口
char buf[128]; //128足够
int size = MakeQSLCmd(buf, m_LsitenPort);//按自己的格式定义查询服务器位置的消息
data_gram.send(buf, size, server, 0);//发送查询服务器位置消息

m_bExit = false;
char buf[1024];
while(!m_bExit)
{
int nRecv = data_gram.recv(buf, sizeof(buf), remote, 0, &timeout);
if(nRecv>0)
{
//do something
}
}

}

我是在家里的电脑(通过ADSL上网的)测试时为何服务器压根儿就没收到客户端发的查询服务器位置的消息?是与发送地址有关吗?
但是在公司的局域网却能成功收到消息,这是为什么呢?先在此跪谢各位兄台了!

|
上QQ需要多播功能吗?

|
qq应该是用域名来找服务器地址,域名它是不会变来变去的.

    
 
 

您可能感兴趣的文章:

  • 如何给局域网中linux服务器设定一个局域网中使用的域名?
  • dos下如何使用网卡,访问局域网资源
  • 如何统计局域网内计算机的使用情况?
  • 在vmware的NAT局域网中使用traceroute的疑惑
  • 局域网共享上网,使用nat时在postrouting中添加masquerade规则允许往外发送,prerouting是不是也要添加规则。
  • UNIX服务器连接公司局域网和INTERNET,如果要阻止公司内部访问QQ、MSN之类的使用是不是用iptables阻止端口?
  • 局域网小规模web服务器,使用哪个linux版本作服务器操作系统比较好,请说明优势,谢谢!
  • [500分]redhat linux9下光纤拨号上网,使用iptables在代理上网时,如何只对局域网开发http服务,其他的FTP、QQ、BT、MSN等服务一律关
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • Jsp可否使用带有GUI的JavaBean,如何使用?
  • c/c++预处理命令预#,##使用介绍
  • asp程序使用的access在Linux下如何使用!
  • 在div中使用css让文字底部对齐的方法
  • 新装的Linux使用root用户不能使用FTP?
  • Python namedtuple(命名元组)使用实例
  • LINUX下使用Eclipse,如何使用交叉编译器?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3