当前位置: 技术问答>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上网的)测试时为何服务器压根儿就没收到客户端发的查询服务器位置的消息?是与发送地址有关吗?
但是在公司的局域网却能成功收到消息,这是为什么呢?先在此跪谢各位兄台了!
///////////////////////////////////////////////////////////////////////////////////////////////////////////
#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应该是用域名来找服务器地址,域名它是不会变来变去的.