这只是一个简单的演示程序,我也不能保证它没有错误。您可以把这个程序中的源码用在您自己的程序中,只要您自己负责程序的质量,并且注明引用部分的原作者。
![]() |
|
2007年2月23日 补充:
要调用远端的 C++ 对象,本地程序需要按约定格式向远端发送:远端对象的类标识,同一个类的不同对象的对象标识(不过在我的这个小程序中远端同一个类只有一个对象,所以我省略了对象标识),成员函数标识,函数参数,然后接收远端返回的调用结果数据。
远端对象的类标识是一个 32位无符号整数,在我的程序中有两个远端对象类,一个可以完成整数的加减法,另一个可以完成浮点数的加减法 (调用远程对象做加减法是有些夸张,但是这样可以演示远程调用如何工做) 。它们的类标识是:
#define CLASS_INT_CALC 10001
#define CLASS_FLOAT_CALC 10002
每个类中有两个成员函数完成加减法,它们的成员函数标识是:
#define FUNC_ADD 20001
#define FUNC_SUB 20002
本地代理对象代表远端对象接受调用,它们的是:
|
代理对象和远端通信调用远端对象。
|
|
远端(服务端)程序,把各个服务端对象的指针保存在 std::map
std::map 中的 key 就是各个类标识,服务端根据客户端传来的类标识调用不同服务对象。
|
|
服务端对象中有一个成员函数指针的 std::map 它的 key 是成员函数标识,服务端对象根据客户端传来成员函数标识用成员函数指针调用不同成员函数,然后把调用结果传回客户端。
|
最后客户端代理对象收到远端调用结果,返回给本地调用者。
我是在我的 win2k/mingw 环境下编译测试这个程序的,程序需要用到 gtkmm 库 , 在这个程序中我没有处理网络字节顺序问题, 实用的程序应该处理这个问题。
mingw 下编译命令是:
服务端程序: g++ -o gmrcmwser gmrcmwser.cc `pkg-config.exe gtkmm-2.4 --cflags --libs` -lgthread-2.0 -lws2_32
客户端程序:g++ -o gmrcmwcli gmrcmwcli.cc `pkg-config.exe gtkmm-2.4 --cflags --libs` -lws2_32
这个程序源码应该可以移植到 Linux , Linux 下编译命令应该是:
服务端程序: g++ -o gmrcmwser gmrcmwser.cc `pkg-config gtkmm-2.4 --cflags --libs` -lgthread-2.0
客户端程序:g++ -o gmrcmwcli gmrcmwcli.cc `pkg-config gtkmm-2.4 --cflags --libs`
zhujiang
2007年2月23日