acedev 发表于 2010-4-16 00:47:43

[已解决]Acceptor在哪可以获取连接进来的客户端IP地址

定义自己的事务处理器
class MySvcHandler: public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>
定义接收器
ACE_Acceptor<MySvcHandler, ACE_SOCK_ACCEPTOR> acceptor
在端口监听连接
ACE_INET_Addr addr(SERVER_PORT_NUM)
acceptor.open(addr)      

请问在哪里可以取到每次连接进来的客户端IP地址和端口号呢
int MySvcHandler::handle_input(ACE_HANDLE fd = ACE_INVALID_HANDLE)


教程例子2_3是用SOCK_Dgram接收数据时传到参数ACE_INET_Addr里
ACE_INET_Addr remote_addr_;
ACE_SOCK_Dgram local_;

local_.recv(data_buf,SIZE_DATA,remote_addr_)

[ 本帖最后由 acedev 于 2010-4-17 09:22 编辑 ]

acedev 发表于 2010-4-16 09:48:00

考虑客户端把本机地址附加到发给服务端的消息里服务端从消息里解析出地址 再发送回复消息
ACE_SOCK::get_local_addr()
(这样设计是考虑客户端发出请求后另开线程等着收回复)

感觉 这个做法不好

服务端能接收连接请求 一定是知道客户端从什么地方连进来的
只是目前还不知道

acedev 发表于 2010-4-16 09:51:04

ACE_SOCK Class

Public Member Functions

int         get_local_addr (ACE_Addr &) const
int         get_remote_addr (ACE_Addr &) cons

以上参考:
http://www.aoc.nrao.edu/php/tjuerges/ALMA/ACE-5.5.2/html/ace/classACE__SOCK.html

acedev 发表于 2010-4-16 10:10:01

问题解决

解决方法:
在MySvcHandle 的 open() 或者 handle_input()
里调用 peer().get_remote_addr(ACE_Addr &) 即可


之前由于VS2005输入 peer(). 后vc助手弹出框里没有对应提示 不能确定方法名字是 get_remote_addr

谢谢关注

winston 发表于 2010-4-16 10:17:09

把客户端的IP地址存储起来,跟本地的C++网络链接对象做映射即可。

acedev 发表于 2010-4-17 09:04:09

原帖由 winston 于 2010-4-16 10:17 发表 http://www.acejoy.com/bbs/images/common/back.gif
把客户端的IP地址存储起来,跟本地的C++网络链接对象做映射即可。

不是很明白

我这么理解对不对
网络链接对象 是 进行数据接收的对象 MySvcHandler 有多个
做映射 是 用set保存 相应的对象IP地址和MySvcHandlerkey-pair

服务端 需要给客户发消息的时候
根据接收者ip 从set里取Handler 来发送

acedev 发表于 2010-4-17 09:19:16

原帖由 acedev 于 2010-4-16 10:10 发表 http://www.acejoy.com/bbs/images/common/back.gif
解决方法:
在MySvcHandle 的 open() 或者 handle_input()
里调用 peer().get_remote_addr(ACE_Addr &) 即可得到ip
...

目前解决办法是
服务端往消息里添加ip,接下来的消息处理程序对消息进行处理,放到服务端的发送消息队列,
服务端依次单个地从队列里取消息,发送出去。
缺点:每发送一个消息新建一个发送对象,效率不高。正考虑如何实现一个发送对象负责发送所有给同一个客户端的消息


请教:
服务端/客户端模式下 服务端给多个客户端发送消息 一般可以采取哪些发送策略

[ 本帖最后由 acedev 于 2010-4-17 09:20 编辑 ]

winston 发表于 2010-4-19 10:21:07

也没别的更多选择,都是一个个发的呀。

acedev 发表于 2010-4-19 10:33:00

回复 #8 winston 的帖子

哈特别感谢你

看了C++NPv2 认识到之前的设计有缺陷
页: [1]
查看完整版本: [已解决]Acceptor在哪可以获取连接进来的客户端IP地址