找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4724|回复: 8

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

[复制链接]
发表于 2010-4-16 00:47:43 | 显示全部楼层 |阅读模式
定义自己的事务处理器
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 编辑 ]
 楼主| 发表于 2010-4-16 09:48:00 | 显示全部楼层
考虑客户端把本机地址附加到发给服务端的消息里  服务端从消息里解析出地址 再发送回复消息
ACE_SOCK::get_local_addr()
(这样设计是考虑客户端发出请求后另开线程等着收回复)

感觉 这个做法不好

服务端能接收连接请求 一定是知道客户端从什么地方连进来的
只是目前还不知道
 楼主| 发表于 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/tjue ... classACE__SOCK.html
 楼主| 发表于 2010-4-16 10:10:01 | 显示全部楼层

问题解决

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


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

谢谢关注
发表于 2010-4-16 10:17:09 | 显示全部楼层
把客户端的IP地址存储起来,跟本地的C++网络链接对象做映射即可。
 楼主| 发表于 2010-4-17 09:04:09 | 显示全部楼层
原帖由 winston 于 2010-4-16 10:17 发表
把客户端的IP地址存储起来,跟本地的C++网络链接对象做映射即可。

不是很明白

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

服务端 需要给客户发消息的时候
根据接收者ip 从set里取Handler 来发送
 楼主| 发表于 2010-4-17 09:19:16 | 显示全部楼层
原帖由 acedev 于 2010-4-16 10:10 发表
解决方法:
在MySvcHandle 的 open() 或者 handle_input()
里调用 peer().get_remote_addr(ACE_Addr &) 即可得到ip
...

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


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

[ 本帖最后由 acedev 于 2010-4-17 09:20 编辑 ]
发表于 2010-4-19 10:21:07 | 显示全部楼层
也没别的更多选择,都是一个个发的呀。
 楼主| 发表于 2010-4-19 10:33:00 | 显示全部楼层

回复 #8 winston 的帖子

哈特别感谢你

看了C++NPv2 认识到之前的设计有缺陷
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 12:54 , Processed in 0.028017 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表