从xmlrpc++ 的Method中获取客户信息

来源:互联网 发布:mac pro 型号 编辑:程序博客网 时间:2024/05/21 19:32

 xmlrpc++提供了一个很好的架构,服务器端方法只需要继承XmlRpcServerMethod,然后实现方法execute,就可以在服务器端新增方法(客户便可以在服务器端执行这个方法了)。非常的简单且方便。但其也有一个最大的问题,就是屏蔽了太多的细节。如果不修改这个库,你无法从外面获得更详细的信息,比如,当前已连接的客户数量,当前连接客户的信息,当前是哪个客户在请求方法等。当你需要这些信息时,便感到有些束手无策。
没有办法,只有修改库了。
需求:
在服务器端执行某方法时,需要知道,当前请求执行该方法的客户端socket信息。

修改部分如下:

1 新增类:SocketInfo,包含IP与端口,没有用系统提供的sockaddr_in

2 类XmlRpcSource 中新增SocketInfo属性,意味通讯对等端的socket信息

3 类XmlRpcServerMethod 中新增SocketInfo属性,保存当前执行该方法的客户端信息

4 方法:int XmlRpcSocket::accept(int fd),新增返回参数,返回客户socket信息SocketInfo
在 (int) ::accept(fd, (struct sockaddr*)&addr, &addrlen); 执行完毕后,将信息从addr中取出,并通过accept返回

5 方法:void XmlRpcServer::acceptConnection()
执行int s = XmlRpcSocket::accept(this->getfd())替换为修改后的accept,将SocketInfo取出
_disp.addSource之前,将该SocketInfo添加到新建的XmlRpcServerConnection*中

6 方法:bool XmlRpcServerConnection::executeMethod(const std::string& methodName,
                                      XmlRpcValue& params, XmlRpcValue& result)   在真正执行方法(也就是method->execute(params, result))之前,将类XmlRpcServerConnection对应的客户端信息SocketInfo设置到需要执行的方法method的SocketInfo中。

OK. 每次在服务器端执行方法的时候,都可以获取请求该方法的客户端IP与端口信息。

原创粉丝点击