[已解决]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 编辑 ] 考虑客户端把本机地址附加到发给服务端的消息里服务端从消息里解析出地址 再发送回复消息
ACE_SOCK::get_local_addr()
(这样设计是考虑客户端发出请求后另开线程等着收回复)
感觉 这个做法不好
服务端能接收连接请求 一定是知道客户端从什么地方连进来的
只是目前还不知道 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
问题解决
解决方法:在MySvcHandle 的 open() 或者 handle_input()
里调用 peer().get_remote_addr(ACE_Addr &) 即可
之前由于VS2005输入 peer(). 后vc助手弹出框里没有对应提示 不能确定方法名字是 get_remote_addr
谢谢关注 把客户端的IP地址存储起来,跟本地的C++网络链接对象做映射即可。 原帖由 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-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 编辑 ] 也没别的更多选择,都是一个个发的呀。
回复 #8 winston 的帖子
哈特别感谢你看了C++NPv2 认识到之前的设计有缺陷
页:
[1]