ACE使用经验:获得动态分配的监听端口号

王朝vc·作者佚名  2006-01-09
宽屏版  字体: |||超大  

我不知道大家有没有碰到过这样的问题,代码如下:

ACE_Asynch_Acceptor<Receiver> acceptor;

ACE_INET_Addr addr= ACE_INET_Addr("HAStatus");

if (acceptor.open (addr,

initial_read_size,

1) == -1)

return -1;

可是怎么样才能获得监听的端口号呢?我折腾了一个下午,才终于解决

首先,我试着通过WINSOCKET API直接操作来取到端口号,因为 acceptor对象提供了一个get_handler()方法

sockaddr_in addr1;

int addr1len=sizeof(struct sockaddr);

if(ACE_OS::getsockname(acceptor.get_handle(),(sockaddr *)&addr1,&addr1len)!=0){

ACE_DEBUG ((LM_DEBUG,"错误!"));

}

ACE_DEBUG ((LM_DEBUG,"port:%d \n",addr1.sin_port ));

代码运行正确,端口号也出现在了控制台,可是是一个无效的端口号,也就是说上面代码获得端口是错误的

在网上通过关键字寻找了N久,直到偶然发现ACE自带的一个类也调用了getsockname sockaddr等方法和结构,才总算解决这个问题

代码如下:

ACE_SOCK_SEQPACK_Association a=ACE_SOCK_SEQPACK_Association(acceptor.get_handle());

size_t addr_size=1;

a.get_local_addrs(&addr,addr_size);

ACE_DEBUG ((LM_DEBUG,"port:%d\n",addr.get_port_number()));

这才是真正的在监听的端口号

就差一点想放弃了,可是还是没放弃

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有