• <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程序開(kāi)發(fā)

            Socket編程在大多數(shù)的編程語(yǔ)言中都是一件比較有趣的事情。它是比較常用的編寫(xiě)通過(guò)網(wǎng)絡(luò)通信的服務(wù)器和客戶端方法。在windows平臺(tái)Socket通信大多是基于MS Winsock設(shè)計(jì)的。Windows支持基于TCP和UDP的socket通信。Windows APIs在socket編程中是非常有用的,但是有些人發(fā)現(xiàn)在用它們工作的時(shí)候有困難。
            所以在這里我介紹一種最簡(jiǎn)單用MFC socket類(lèi)進(jìn)行socket編程的方法。這不僅可以使你的工作變得簡(jiǎn)單而且能減少你在網(wǎng)絡(luò)程序上的開(kāi)發(fā)時(shí)間。你可以定制一個(gè)socket類(lèi),然后你可以在你的其他的網(wǎng)絡(luò)應(yīng)用程序中重用。
            在socket編程中,MFC提供了兩個(gè)基本的類(lèi),分別是CAsyncSocket和Csocket。Csocket是從CAsyncSocket繼承來(lái)的。我們可以建立定制的socket類(lèi),也是從CasyncSocket繼承而來(lái)的,當(dāng)然也是為了我們程序特殊的需要。
            初始化socket
            首先需要調(diào)用AfxSocketInit()函數(shù)來(lái)初始化我們的socket環(huán)境。
            為了初始化sockets,我們需要調(diào)用AfxSocketInit()函數(shù)。它通常是在MFC中的InitInstance()函數(shù)中被調(diào)用的。如果我們用程序向?qū)?lái)創(chuàng)建socket程序的話,查看“use Windows Sockets”這個(gè)選項(xiàng),然后選中它。它將會(huì)自動(dòng)的為我們創(chuàng)建這個(gè)步驟了。(如果我們沒(méi)有選中這個(gè)選項(xiàng)的話,我們也可以手動(dòng)添加這些代碼的。)這個(gè)函數(shù)的返回值顯示這個(gè)函數(shù)的調(diào)用成功或失敗。
            BOOL CServerApp::InitInstance()
            {....
            if( AfxSocketInit() == FALSE)
            ? {
            ? AfxMessageBox("Sockets Could Not Be Initialized");
            ? return FALSE;
            ? }
            ? ...
            }
            創(chuàng)建Server Sockets
            為了創(chuàng)建一個(gè)Server Socket,我們需要聲明一個(gè)CAyncSocket的變量或者我們自己定制的一個(gè)從AyncSocket或是Cscket繼承來(lái)的類(lèi)的類(lèi)型的變量。然后調(diào)用Create()函數(shù),同時(shí)指定監(jiān)聽(tīng)的端口。這個(gè)函數(shù)的返回值顯示這個(gè)函數(shù)的調(diào)用成功或失敗。
            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;
            }
            創(chuàng)建Client Sockets
            為了創(chuàng)建Client socket類(lèi),我們需要聲明一個(gè)CAyncSocket的變量或者我們自己定制的一個(gè)從AyncSocket或是Cscket繼承來(lái)的類(lèi)的類(lèi)型的變量。然后調(diào)用Create()函數(shù),同時(shí)指定監(jiān)聽(tīng)的端口。這個(gè)函數(shù)的返回值顯示這個(gè)函數(shù)的調(diào)用成功或失敗。
            m_sConnected.Create();
            m_sConnected.Connect("server ip",port);
            監(jiān)聽(tīng)客戶端的連接
            創(chuàng)建了server socket以后,我們要進(jìn)行監(jiān)聽(tīng)。調(diào)用Listen()函數(shù)。這個(gè)函數(shù)的返回值顯示這個(gè)函數(shù)的調(diào)用成功或失敗。
            if( m_sListener.Listen()== FALSE)
            {
            AfxMessageBox("Unable to Listen on that port,please try another port");
            m_sListener.Close();
            return;
            }
            接受連接
            連接請(qǐng)求要被接受accept,是用另外的socket,不是正在監(jiān)聽(tīng)的socket。請(qǐng)參看代碼。
            void CXXXDlg::OnAccept()
            {
            ?CString strIP;
            ?UINT port;
            ?if(m_sListener.Accept(m_sConnected))
            ?{
            ? m_sConnected.GetSockName(strIP,port); //應(yīng)該是GetPeerName,獲取對(duì)方的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");
            ?}
            }
            發(fā)送數(shù)據(jù)
            數(shù)據(jù)放在一個(gè)buffer中或是結(jié)構(gòu)體中,調(diào)用send()函數(shù)發(fā)送。
            m_sConnected.Send(pBuf,iLen);
            接受數(shù)據(jù)
            調(diào)用receive()接受數(shù)據(jù)。
            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;?????????
            ? }
            }
            關(guān)閉連接
            m_sConnected.ShutDown(0);??? 停止發(fā)送數(shù)據(jù)
            m_sConnected.ShutDown(1);??? 停止接受數(shù)據(jù)
            m_sConnected.ShutDown(2);??? 停止發(fā)送接受數(shù)據(jù)
            m_sConnected.Close();
            編寫(xiě)自己的socket類(lèi)
            在class view中選擇添加一個(gè)新類(lèi),設(shè)置它的基類(lèi)為CAsyncSocket,在類(lèi)向?qū)У膸椭绿砑尤缦碌囊恍┖瘮?shù)。
            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;
            };
            設(shè)置“Parent Dialog”
            調(diào)用這個(gè)socket類(lèi)的SetParentDlg函數(shù),保證當(dāng)socket事件發(fā)生的時(shí)候這個(gè)窗體能接收到。
            m_sListener.SetParentDlg(this);
            m_sConnected.SetParentDlg(this);
            建立Socket 事件和窗體成員函數(shù)之間的聯(lián)系
            在這個(gè)窗體類(lèi)中添加一些函數(shù),比如void OnReceive(); void OnClose(); void OnAccept(); void OnConnect()等,它們會(huì)在我們編寫(xiě)的的socket類(lèi)中調(diào)用到。
            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);
            }
            這里只寫(xiě)了一個(gè)OnAccept()函數(shù),其他的幾個(gè)中也有類(lèi)似的調(diào)用。詳細(xì)的請(qǐng)參考代碼。

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

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理



            <2006年7月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿(7)

            隨筆檔案

            最新隨筆

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久se精品一区二区影院| 手机看片久久高清国产日韩 | 久久福利青草精品资源站| 无码八A片人妻少妇久久| 蜜桃麻豆WWW久久囤产精品| 色欲久久久天天天综合网精品| 久久久久亚洲Av无码专| 狠狠精品干练久久久无码中文字幕| 久久男人AV资源网站| 色婷婷综合久久久久中文| 国产欧美久久一区二区| 欧美午夜精品久久久久久浪潮| 久久综合狠狠综合久久| 久久久黄片| 99久久精品毛片免费播放| 久久久久久久亚洲精品| 狠狠色婷婷久久一区二区三区| 久久久久久av无码免费看大片| 亚洲精品乱码久久久久久按摩| 97超级碰碰碰碰久久久久| 精品国产乱码久久久久久呢 | 精品久久久久久无码人妻热| 久久久久se色偷偷亚洲精品av | 久久精品中文无码资源站| 久久久久久青草大香综合精品| 粉嫩小泬无遮挡久久久久久| 久久伊人精品一区二区三区| 91精品国产综合久久香蕉 | 国产午夜精品久久久久九九电影| 久久精品国产亚洲AV香蕉| 久久国产成人亚洲精品影院| 久久91精品国产91久久户| 久久久久久久久久久久中文字幕| 亚洲国产日韩欧美综合久久| 久久国产精品免费| 国产激情久久久久影院小草| 九九99精品久久久久久| 97久久久精品综合88久久| 久久久久亚洲AV无码永不| 久久久久久亚洲精品成人| 久久99国产精品尤物|