• <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>

            天行健 君子當自強而不息

            創建游戲內核(23)

             

            本篇是創建游戲內核(22)的續篇,涉及到的DirectPlay基礎知識請參閱使用DirectPlay進行網絡互聯(1)。

             

            網絡內核包括三個類:NETWORK_ADAPTER,NETWORK_SERVER,NETWORK_CLIENT

             

            使用NETWORK查詢網絡適配器


            NETWORK_ADAPTER類用于枚舉系統上安裝了的TCP/IP設備。為了同客戶端建立連接,必須知道設備的GUID,這正是NETWORK_ADAPTER類的用途。


            來看看NETWORK_ADAPTER類的定義:

            //====================================================================================
            // This class encapsulate for network adapters.
            //====================================================================================
            typedef class NETWORK_ADAPTER
            {
            public:
                NETWORK_ADAPTER();
                ~NETWORK_ADAPTER();

                BOOL init();
                
            void shutdown();

                
            long get_num_adapters();
                BOOL get_name(
            ulong index, char* name);
                GUID* get_guid(
            ulong index);

                
            static HRESULT WINAPI net_msg_handler(PVOID user_contex, DWORD msg_id, PVOID msg_buffer);

            private:
                DPN_SERVICE_PROVIDER_INFO* _adapter_list;
                
            ulong _num_adapters;
            } *NETWORK_ADAPTER_PTR;

            接著是它的實現:

            //---------------------------------------------------------------------------------
            // Callback function that receives all messages from the server, and receives indications 
            // of session changes from the IDirectPlay8Client interface. 
            //---------------------------------------------------------------------------------
            HRESULT WINAPI NETWORK_ADAPTER::net_msg_handler(PVOID user_contex, DWORD msg_id, PVOID msg_buffer)
            {
                
            return S_OK;
            }

            //---------------------------------------------------------------------------------
            // Constructor, initialize member data.
            //---------------------------------------------------------------------------------
            NETWORK_ADAPTER::NETWORK_ADAPTER()
            {
                _adapter_list = NULL;
            }

            //---------------------------------------------------------------------------------
            // Destructor, release resource.
            //---------------------------------------------------------------------------------
            NETWORK_ADAPTER::~NETWORK_ADAPTER()
            {
                shutdown();
            }

            //---------------------------------------------------------------------------------
            // Release resource.
            //---------------------------------------------------------------------------------
            void NETWORK_ADAPTER::shutdown()
            {
                delete[] _adapter_list;
                _adapter_list = NULL;

                _num_adapters = 0;
            }

            //---------------------------------------------------------------------------------
            // Enumerate adapter lists.
            //---------------------------------------------------------------------------------
            BOOL NETWORK_ADAPTER::init()
            {
                IDirectPlay8Client* client = NULL;
                DWORD size = 0;

                
            // free allocated resource first
                shutdown();

                
            // create DirectPlay client component
                if(FAILED(CoCreateInstance(CLSID_DirectPlay8Client, NULL, CLSCTX_INPROC, IID_IDirectPlay8Client, (void**) &client)))
                    
            return FALSE;

                
            // assign a message handler to network component
                if(FAILED(client->Initialize(NULL, net_msg_handler, 0)))
                    
            goto fail;

                
            // query the required size of the data buffer
                if(client->EnumServiceProviders(&CLSID_DP8SP_TCPIP, NULL, _adapter_list, &size, &_num_adapters, 0) 
                        != DPNERR_BUFFERTOOSMALL)
                    
            goto fail;

                
            // allocate a buffer
                if((_adapter_list = (DPN_SERVICE_PROVIDER_INFO*) new BYTE[size]) == NULL)
                    
            goto fail;

                
            // enumerate again
                if(FAILED(client->EnumServiceProviders(&CLSID_DP8SP_TCPIP, NULL, _adapter_list, &size, &_num_adapters, 0)))
                    
            goto fail;

                client->Release();
                
            return TRUE;

            fail:
                client->Release();
                
            return FALSE;
            }

            //---------------------------------------------------------------------------------
            // Get number of adapters.
            //---------------------------------------------------------------------------------
            long NETWORK_ADAPTER::get_num_adapters()
            {
                
            return _num_adapters;
            }

            //---------------------------------------------------------------------------------
            // Get adapter name.
            //---------------------------------------------------------------------------------
            BOOL NETWORK_ADAPTER::get_name(ulong index, char* name)
            {
                
            if(_adapter_list == NULL || index >= _num_adapters)
                    
            return FALSE;

                
            // name must be at least MAX_PATH bytes in size
                wcstombs(name, _adapter_list[index].pwszName, MAX_PATH);

                
            return TRUE;
            }

            //---------------------------------------------------------------------------------
            // Return pointer to adapter GUID.
            //---------------------------------------------------------------------------------
            GUID* NETWORK_ADAPTER::get_guid(ulong index)
            {
                
            if(_adapter_list == NULL || index >= _num_adapters)
                    
            return FALSE;

                
            return &_adapter_list[index].guid;
            }
             

            測試代碼:
            /*****************************************************************************
            PURPOSE:
                Test for class NETWORK_ADAPTER.
            *****************************************************************************/


            #include "Core_Global.h"

            class APP : public APPLICATION
            {
            public:
                BOOL init()
                {
                    
            if(! _adapter.init())
                        
            return FALSE;

                    
            char buffer[2048] = {0};
                    
            char name[MAX_PATH] = {0};
                    
            char temp[MAX_PATH] = {0};

                    
            for(long i = 0; i < _adapter.get_num_adapters(); i++)
                    {           
                        _adapter.get_name(i, name);
                        
                        sprintf(temp, "%d: %s\n", i, name);

                        strcat(buffer, temp);
                    }

                    MessageBox(NULL, buffer, "adapter_test", MB_OK);
                    
                    
            return TRUE;
                }

                BOOL frame()
                {
                    
            return TRUE;
                }

                BOOL shutdown()
                {
                    
            return TRUE;
                }

            private:
                NETWORK_ADAPTER _adapter;   
            };

            int PASCAL WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
            {
                APP app;

                
            return app.run();
            }

            下載源碼和工程

            程序截圖:


            posted on 2007-10-11 22:21 lovedday 閱讀(225) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            精品国产乱码久久久久久人妻| 91亚洲国产成人久久精品网址| 亚洲精品国产成人99久久| 久久久老熟女一区二区三区| 久久综合久久综合久久| 久久se这里只有精品| 国产亚洲精品久久久久秋霞 | 久久精品亚洲男人的天堂| 精品国产99久久久久久麻豆| 久久久久亚洲AV无码专区体验| 久久青青草原国产精品免费| 久久久久人妻一区二区三区| 久久精品男人影院| 久久精品人人做人人爽电影蜜月| 国产—久久香蕉国产线看观看| 精品久久久久久无码中文字幕一区 | 中文字幕亚洲综合久久2| 久久人人爽人人爽人人片AV不 | 国产一区二区三区久久精品| 久久亚洲精品国产亚洲老地址| 久久国产精品免费| 精品人妻久久久久久888| 亚洲欧美成人久久综合中文网| 天堂无码久久综合东京热| 亚洲狠狠久久综合一区77777| 亚洲av伊人久久综合密臀性色| 久久精品人妻中文系列| 久久久久国产| 国产ww久久久久久久久久| 色综合久久久久| 狠狠色丁香久久综合五月| 久久久国产精品亚洲一区| 亚洲精品无码久久久久| 久久人人爽人人爽人人爽| 久久精品国产精品亚洲精品| 久久久久亚洲AV成人网人人网站| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久99精品国产麻豆| 久久99热只有频精品8| 精品久久久久久无码专区| 成人综合伊人五月婷久久|