• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            qiezi的學習園地

            AS/C/C++/D/Java/JS/Python/Ruby

              C++博客 :: 首頁 :: 新隨筆 ::  ::  :: 管理 ::
            C++ 0x keynote(以下簡稱0x)中描述了這樣一個看起來不錯的東西:

            1、本地調用代碼:
            // use local object: 
            X x; 
            A a; 
            std::string s("abc"); 
            // … 
            x.f(a, s); 
            
            2、使用遠程代理wrapper層:
            // use remote object : 
            proxy<X> x; 
            x.connect("my_host"); 
            A a; 
            std::string s("abc"); 
            // … 
            x.f(a, s); 
            

            僅使用一個包裝層就完成遠程調用?從目前的C++來看基本上不可能。 今天突然想到可以使用aspect c++來生成代碼,因為aspect c++在生成代碼時,也生成了一些簡單的元信息,可以在函數里面取得函數的原型、各參數的類型等。 根據0x的描述,我編寫了簡單的測試代碼:

            #include <string>
            #include <iostream>
            #include <sstream>
            #include <vector>
            using namespace std;
            
            class LoginService
            {
            public:
            	virtual bool login (const string& name, const string& password, string& session) = 0;
            	virtual void logout (const string& session) = 0;
            };
            
            class RemoteCall
            {
            public:
            	bool connect (const char* host, unsigned short port)
            	{
            		cout << "connect success" << endl;
            		return true;
            	}
            	bool send (const char* p, size_t len)
            	{
            		cout << "send: " << endl;
            		cout << string(p, len) << endl;
            		return true;
            	}
            	bool recv(char* p, size_t len)
            	{
            		return true;
            	}
            };
            
            class RemoteLoginService : public LoginService, public RemoteCall
            {
            public:
            	virtual bool login (const string& name, const string& password, string& session)
            	{
            		return false;
            	}
            	virtual void logout (const string& session)
            	{
            	}
            };
            
            int main(int argc, char *argv[])
            {
            	RemoteLoginService rls;
            	rls.connect("localhost", 3957);
            	string session;
            	rls.login("lijie", "lijie", session);
            	rls.logout(session);
            	
            	return 0;
            }
            

            現在的目標是加入一個方面,讓RemoteLoginService具有遠程調用功能。當然由于此處RemoteCall并未實現,所以只要能夠把這個調用正確序列化就算完成目標。 這個方面完成后如下:
            aspect Remote
            {
            	pointcut remote_class() = "RemoteCall";
            	pointcut remote_call() = derived(remote_class()) && !remote_class();
            
            	pointcut virtual_methods() = "% ...::%(...)";
            
            	advice within(remote_call()) && execution(virtual_methods()): before(){
            		stringstream ss;
            		ss << "\tcall:" << JoinPoint::signature() << endl;
            		ss << "\targuments:";
            		for (size_t i=0; i<JoinPoint::args(); ++i)
            		{
            			string arg(tjp->argtype(i));
            			if (arg.find("basic_string") != arg.npos)
            			{
            				ss << *(string*)tjp->arg(i) << "|";
            			}
            		}
            		string send_str = ss.str();
            		tjp->target()->send (send_str.c_str(), send_str.size());
            	}
            
            	advice within(remote_call()) && execution(virtual_methods()): after(){
            		vector<char> buffer(1024, '\0');
            		tjp->target()->recv (&(*buffer.begin()), buffer.size());
            		// 解析接收的數據,遠程調用結果寫入tjp->result()指向的內存
            	}
            };

            它匹配所有從RemoteCall上派生的類,為它的每個方法加入遠程調用代碼以及調用結果處理代碼。 生成并編譯運行,輸出如下:
            connect success
            send:
                    call:bool RemoteLoginService::login(const ::std::basic_string< char > &,const ::std::basic_string< char > &,::std::basic_string< char > &)
                    arguments:lijie|lijie||
            send:
                    call:void RemoteLoginService::logout(const ::std::basic_string< char > &)
                    arguments:|

            由于完整序列化了各個參數值,第一個目標——生成遠程調用代碼——算是完成了。

            下一個目標,考慮服務端如何編寫?服務端需要開啟一個服務,并注冊各個服務接口。

            要達到這個目標,aspect c++需要提供類、方法級別的類型及名稱獲取,不過aspect c++在這方面沒有提供更多方便,現在只能在方法執行時獲得方法的信息,它所生成的“元信息”過于簡單,而且為了效率考慮都實現為各個獨立的結構,結構的成員也大都是static的,所以無法使用一個合適的接口來反射,期待以后能加入這些特性。

            所以這第2個目標實際上無法簡單地完成,除非在服務端手工添加服務注冊代碼,這個部分工作量稍小,但還是可以做到的。
            posted on 2005-12-19 22:50 qiezi 閱讀(1332) 評論(9)  編輯 收藏 引用 所屬分類: C++
            色妞色综合久久夜夜| 国产精品成人99久久久久| 亚洲午夜精品久久久久久浪潮| 天堂无码久久综合东京热| 99久久久久| 一本一本久久a久久综合精品蜜桃 一本一道久久综合狠狠老 | 亚洲午夜久久久久久久久久| 精品久久久久久久久久中文字幕| 色妞色综合久久夜夜| 久久水蜜桃亚洲av无码精品麻豆| 久久综合亚洲色HEZYO国产| 免费无码国产欧美久久18| 国产高潮国产高潮久久久| 亚洲日本久久久午夜精品| 91性高湖久久久久| 久久综合久久美利坚合众国| 国产精品久久网| 亚洲综合久久久| 香蕉久久夜色精品国产小说| 国产香蕉久久精品综合网| 久久久国产精品福利免费| 久久精品国产99国产电影网| 国产成人精品久久一区二区三区 | 国产ww久久久久久久久久| 久久午夜福利无码1000合集| 国产综合久久久久久鬼色| 久久无码专区国产精品发布| 国内精品久久久久久麻豆| 久久精品www人人爽人人| 无码人妻久久久一区二区三区| 久久精品国产第一区二区三区| 中文字幕久久亚洲一区| 97超级碰碰碰久久久久| 色偷偷偷久久伊人大杳蕉| 久久人人青草97香蕉| 欧美久久一区二区三区| 久久九色综合九色99伊人| 国产精品久久久久a影院| 久久精品国产亚洲av瑜伽| 久久天天躁狠狠躁夜夜2020| 国产亚洲色婷婷久久99精品91|