• <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>
            asm, c, c++ are my all
            -- Core In Computer
            posts - 139,  comments - 123,  trackbacks - 0

            MFC socket程序開發

            Socket編程在大多數的編程語言中都是一件比較有趣的事情。它是比較常用的編寫通過網絡通信的服務器和客戶端方法。在windows平臺Socket通信大多是基于MS Winsock設計的。Windows支持基于TCP和UDP的socket通信。Windows APIs在socket編程中是非常有用的,但是有些人發現在用它們工作的時候有困難。
            所以在這里我介紹一種最簡單用MFC socket類進行socket編程的方法。這不僅可以使你的工作變得簡單而且能減少你在網絡程序上的開發時間。你可以定制一個socket類,然后你可以在你的其他的網絡應用程序中重用。
            在socket編程中,MFC提供了兩個基本的類,分別是CAsyncSocket和Csocket。Csocket是從CAsyncSocket繼承來的。我們可以建立定制的socket類,也是從CasyncSocket繼承而來的,當然也是為了我們程序特殊的需要。
            初始化socket
            首先需要調用AfxSocketInit()函數來初始化我們的socket環境。
            為了初始化sockets,我們需要調用AfxSocketInit()函數。它通常是在MFC中的InitInstance()函數中被調用的。如果我們用程序向導來創建socket程序的話,查看“use Windows Sockets”這個選項,然后選中它。它將會自動的為我們創建這個步驟了。(如果我們沒有選中這個選項的話,我們也可以手動添加這些代碼的。)這個函數的返回值顯示這個函數的調用成功或失敗。
            BOOL CServerApp::InitInstance()
            {....
            if( AfxSocketInit() == FALSE)
            ? {
            ? AfxMessageBox("Sockets Could Not Be Initialized");
            ? return FALSE;
            ? }
            ? ...
            }
            創建Server Sockets
            為了創建一個Server Socket,我們需要聲明一個CAyncSocket的變量或者我們自己定制的一個從AyncSocket或是Cscket繼承來的類的類型的變量。然后調用Create()函數,同時指定監聽的端口。這個函數的返回值顯示這個函數的調用成功或失敗。
            UpdateData(TRUE);
            m_sListener.Create(m_port);
            if(m_sListener.Listen()==FALSE)
            {
            AfxMessageBox("Unable to Listen on that port,please try another port");
            m_sListener.Close();
            return;
            }
            創建Client Sockets
            為了創建Client socket類,我們需要聲明一個CAyncSocket的變量或者我們自己定制的一個從AyncSocket或是Cscket繼承來的類的類型的變量。然后調用Create()函數,同時指定監聽的端口。這個函數的返回值顯示這個函數的調用成功或失敗。
            m_sConnected.Create();
            m_sConnected.Connect("server ip",port);
            監聽客戶端的連接
            創建了server socket以后,我們要進行監聽。調用Listen()函數。這個函數的返回值顯示這個函數的調用成功或失敗。
            if( m_sListener.Listen()== FALSE)
            {
            AfxMessageBox("Unable to Listen on that port,please try another port");
            m_sListener.Close();
            return;
            }
            接受連接
            連接請求要被接受accept,是用另外的socket,不是正在監聽的socket。請參看代碼。
            void CXXXDlg::OnAccept()
            {
            ?CString strIP;
            ?UINT port;
            ?if(m_sListener.Accept(m_sConnected))
            ?{
            ? m_sConnected.GetSockName(strIP,port); //應該是GetPeerName,獲取對方的IP和port
            ? m_status="Client Connected,IP :"+ strIP;
            ? m_sConnected.Send("Connected To Server",strlen("Connected To? Server"));?????
            UpdateData(FALSE);
            ?}
            ?else
            ?{
            ?AfxMessageBox("Cannoot Accept Connection");
            ?}
            }
            發送數據
            數據放在一個buffer中或是結構體中,調用send()函數發送。
            m_sConnected.Send(pBuf,iLen);
            接受數據
            調用receive()接受數據。
            void CXXXrDlg::OnReceive()
            {
            char *pBuf =new char [1025];
            CString strData;
            int iLen;
            iLen=m_sConnected.Receive(pBuf,1024);???
            if(iLen == SOCKET_ERROR)?????
            ? {
            ? AfxMessageBox("Could not Recieve");?????
            ? }?????
            else????
            ? {
            ? pBuf[iLen]=NULL;
            ? strData=pBuf;
            ? m_recieveddata.Insert(m_recieveddata.GetLength(),strData);
            ?//display in server?????????????
            ?UpdateData(FALSE);
            ?m_sConnected.Send(pBuf,iLen);? //send the data back to the Client????
            ?delete pBuf;?????????
            ? }
            }
            關閉連接
            m_sConnected.ShutDown(0);??? 停止發送數據
            m_sConnected.ShutDown(1);??? 停止接受數據
            m_sConnected.ShutDown(2);??? 停止發送接受數據
            m_sConnected.Close();
            編寫自己的socket類
            在class view中選擇添加一個新類,設置它的基類為CAsyncSocket,在類向導的幫助下添加如下的一些函數。
            class MySocket : public CAsyncSocket
            { // Attributes
            public:
            ?// Operations
            public:
            MySocket();
            virtual ~MySocket();
            // Overrides
            public:
            void SetParentDlg(CDialog *pDlg);// ClassWizard generated virtual function overrides
            //{{AFX_VIRTUAL(MySocket)
            public:
            virtual void OnAccept(int nErrorCode);
            virtual void OnClose(int nErrorCode);
            virtual void OnConnect(int nErrorCode);
            virtual void OnOutOfBandData(int nErrorCode);
            virtual void OnReceive(int nErrorCode);
            virtual void OnSend(int nErrorCode);
            //}}AFX_VIRTUAL // Generated message map functions
            //{{AFX_MSG(MySocket)
            // NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG
            protected:
            private:
            CDialog * m_pDlg;
            };
            設置“Parent Dialog”
            調用這個socket類的SetParentDlg函數,保證當socket事件發生的時候這個窗體能接收到。
            m_sListener.SetParentDlg(this);
            m_sConnected.SetParentDlg(this);
            建立Socket 事件和窗體成員函數之間的聯系
            在這個窗體類中添加一些函數,比如void OnReceive(); void OnClose(); void OnAccept(); void OnConnect()等,它們會在我們編寫的的socket類中調用到。
            void MySocket::OnAccept(int nErrorCode)
            {
            // TODO: Add your specialized code here and/or call the base class
            if(nErrorCode==0)
            {
            ((CServerDlg*)m_pDlg)->OnAccept();
            }
            CAsyncSocket::OnAccept(nErrorCode);
            }
            這里只寫了一個OnAccept()函數,其他的幾個中也有類似的調用。詳細的請參考代碼。

            posted on 2006-07-28 01:07 Jerry Cat 閱讀(796) 評論(0)  編輯 收藏 引用

            <2006年5月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            常用鏈接

            留言簿(7)

            隨筆檔案

            最新隨筆

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品亚洲AV久久久无码| 9999国产精品欧美久久久久久| 久久精品免费大片国产大片| 一本色道久久综合狠狠躁篇| 国产色综合久久无码有码| 欧美伊香蕉久久综合类网站| 午夜精品久久久久久久无码| av无码久久久久久不卡网站| 久久久久亚洲精品中文字幕| 欧美丰满熟妇BBB久久久| 久久人人超碰精品CAOPOREN| 国内精品久久久久久久97牛牛| 久久精品人妻一区二区三区| 精品久久久久久亚洲| 久久人人爽人人爽人人片AV不 | 久久国产视频99电影| 久久久久久亚洲AV无码专区| 久久久久18| 91秦先生久久久久久久| 久久久久成人精品无码中文字幕 | 国产亚洲婷婷香蕉久久精品| 久久久久久久波多野结衣高潮 | 69国产成人综合久久精品| 久久久久亚洲国产| 亚州日韩精品专区久久久| 91精品国产综合久久四虎久久无码一级| 国产精品久久久久免费a∨| 久久精品国产亚洲Aⅴ香蕉| 中文字幕成人精品久久不卡 | 久久国产视屏| 久久国产成人午夜aⅴ影院 | 国产成人综合久久综合| 久久亚洲私人国产精品| 综合网日日天干夜夜久久| 亚洲中文字幕无码久久2017| 久久久久亚洲AV片无码下载蜜桃| 久久人人爽人人爽人人片AV麻豆| 久久精品成人免费国产片小草| 久久99国产精品二区不卡| 狠色狠色狠狠色综合久久| 久久综合狠狠综合久久激情 |