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

            Tauruser

            Enjoy Every Day
            posts - 34, comments - 95, trackbacks - 0, articles - 5
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            這兩天在研究 Windows Socket 編程,今天總算有了一點突破,把自己做的東西發上來。

            CAsyncSocket 類在非常低的級別上封裝 Windows Sockets API 。 CAsyncSocket 適合那些對網絡通信細節很了解,但希望利用回調的便利通知網絡事件的程序員使用。如果想利用 Windows Sockets 方便地處理 MFC 應用程序中的多個網絡協議,而又不想放棄靈活性,可以考慮使用 CAsyncSocket 。

            ?????? 本文介紹如何用 CasyncSocket 類進行雙機通信應用程序的開發。后面附有源程序。

            ?????? 要使用 CasyncSocket 進行通信,首先我們需要創建一個 SOCKET ??梢允褂?/span> CasyncSocket Create() 方法。

            構造一個 CAsyncSocket 對象并使用該對象創建基礎 SOCKET 句柄。

            套接字的創建遵循兩階段構造的 MFC 模式。

            例如:

            CAsyncSocket?sock;

            sock.Create(?);?
            // ?Use?the?default?parameters?
            - ?或? - ?
            CAsyncSocket
            * ?pSocket? = ? new ?CAsyncSocket;

            int ?nPort? = ? 27 ;

            pSocket
            -> ?Create(?nPort,?SOCK_DGRAM?);?

            上面的第一個構造函數在堆棧上創建一個

            CAsyncSocket 對象,第二個構造函數在堆上創建 CAsyncSocket 。上面的第一個 Create 調用使用默認參數創建流式套接字,第二個 Create 調用創建具有指定端口和地址的數據文報套接字。(任一個 Create 版本都可以和任一種構造方法一起使用。)

            Create 的參數有:

            端口 :短整型。

            對于服務器套接字,必須指定端口 。對于客戶端套接字,通常接受此參數的默認值,該值允許 Windows Sockets 選擇端口。

            套接字類型: SOCK_STREAM (默認值)或 SOCK_DGRAM

            套接字 地址 ,如 “ftp.microsoft.com” “128.56.22.8”

            該地址為網絡上的網際協議 (IP) 地址。很可能要始終依賴此參數的默認值。

            ?????? SOCKET 創建完之后就可使使用了。如果是客戶端就可以使用 CAsyncSocket::Connect 將此套接字對象連接到服務器套接字。如果是服務器端就可以使用使用 CAsyncSocket::Listen 偵聽來自客戶端的連接嘗試。接收到連接請求時,用 CAsyncSocket::Accept 接受該請求。

            注意 Accept 成員函數采用對新的空 CSocket 對象的引用作為它的參數。在調用 Accept 之前,必須構造該對象。如果此套接字對象超出范圍,則連接關閉。

            銷毀 CAsyncSocket 對象。

            如果在堆棧上創建了套接字對象,當包含函數超出范圍時將調用此對象的析構函數。如果使用 new 運算符在堆上創建 了套接字對象,則您必須負責使用 delete 運算符銷毀此對象。

            ?????? 析構函數在銷毀對象之前調用對象的 Close 成員函數。

            ?

            當連接建立的時候,就可以進行通信了。 CasycnSocket 類提供以下需要重載的成員函數。

            OnAccept

            當服務器端接收到連接請求的時候回調這個函數

            OnClose

            當連接關閉的時候,回調

            OnConnect

            當連接嘗試結束的時候,回調 ( 此時不能確保連接建立 )

            OnOutOfBandData

            Notifies a receiving socket that there is out-of-band data to be read on the socket, usually an urgent message.

            OnReceive

            接收到信息的時候回調

            OnSend

            當發送信息的時候回調

            ?

            連接建立之后,就可以通過 send() receive() 進行數據的收發 ( 當為 TCP 連接的時候 ) ,通過 Sendto() ReceiveFrom () 收發數據,當為 UDP 連接的時候。

            廢話少說,放上我的例程,整個程序的主要部份就是自己構造的一個新類 CmySocket() 進行通信。里面傳遞了當前聊天窗體的句柄句柄,以便使用回調函數調用窗體類進行事件響應。

            ?????? 程序不是很大,有興趣的朋友可以和我聯系。

            源程序下載?

            最后附上通訊的流程。

            服務器

            客戶端

            // construct a socket

            CSocket sockSrvr;

            // construct a socket

            CSocket sockClient;

            // create the SOCKET

            sockSrvr.Create(nPort); 1,2

            // create the SOCKET

            sockClient.Create( ); 2

            // start listening

            sockSrvr.Listen( );

            ?

            ?

            // seek a connection

            sockClient.Connect(strAddr, nPort); 3,4

            // construct a new, empty socket

            CSocket sockRecv;

            // accept connection

            sockSrvr.Accept( sockRecv ); 5

            ?

            // construct file object

            CSocketFile file(&sockRecv);

            // construct file object

            CSocketFile file(&sockClient);

            // construct an archive

            CArchive arIn(&file,
            CArchive::load);

            - -

            CArchive arOut(&file,
            CArchive::store);

            - 或兩者 -

            // construct an archive

            CArchive arIn(&file,
            CArchive::load);

            - -

            CArchive arOut(&file,
            CArchive::store);

            - 或兩者 -

            // use the archive to pass data:

            arIn >>dwValue;

            - -

            arOut < < dwValue; 6

            // use the archive to pass data:

            arIn >>dwValue;

            - -

            arOut < < dwValue; 6

            1. 這里的 nPort 是端口號。有關端口的詳細信息,請參見 Windows Sockets:端口和套接字地址

            2. 服務器必須始終指定一個端口,以便客戶端可以連接。 Create 調用有時也指定地址。在客戶端使用默認參數,這些參數要求 MFC 使用任何可用端口。

            3. 這里的 nPort 是端口號, strAddr 是計算機地址或網際協議 (IP) 地址。

            4. 計算機地址可以采用幾種形式:“ftp.microsoft.com”、“microsoft.com”。IP 地址采用“以點分隔的數字”形式,如“127.54.67.32”。 Connect 函數查看地址是否為以點分隔的數字(但它不確保該數字是網絡上的有效計算機)。如果不是,則 Connect 使用其他某種形式的計算機名稱。

            5. 當在服務器端調用 Accept 時,傳遞對新套接字對象的引用。必須首先構造該對象,但不對它調用 Create 。注意,如果此套接字對象超出范圍,則連接關閉。MFC 將新對象連接到 SOCKET 句柄。可以在堆棧上構造此套接字(如表中所示)或在堆上構造。

            6. 存檔和套接字文件在超出范圍時將被關閉。套接字對象超出范圍或被刪除時,對象的析構函數也對此套接字對象調用 Close 成員函數。有關順序的其他說明

            Feedback

            # re: 使用AsycnSocket類進行簡單雙機通訊  回復  更多評論   

            2006-05-31 22:28 by 含笑半步癲
            好東西,不過有沒有api版本的瞻仰一下。不會MFC:(

            # re: 使用AsycnSocket類進行簡單雙機通訊  回復  更多評論   

            2006-05-31 22:58 by Tauruser
            不好意思,我對直接用API也不是很了解,我剛接觸網絡編程。

            # re: 使用AsycnSocket類進行簡單雙機通訊  回復  更多評論   

            2007-04-27 19:48 by laozhu
            很不錯,雖然不是很復雜的內容,但是光看MSDN沒有這么簡單明了。很不錯。

            # re: 使用AsycnSocket類進行簡單雙機通訊  回復  更多評論   

            2008-10-03 11:24 by zake
            自己寫的?完全是盜用Microsoft官方主頁中的MSDN詳解的內容嘛!
            不是自己寫的,至少也應該注明出處吧,資源共享。

            http://msdn.microsoft.com/zh-cn/library/cc468332(VS.71).aspx

            這里面東西概括性很強。
            久久精品无码专区免费青青| 久久婷婷五月综合国产尤物app| 精品国产乱码久久久久久呢| 国产精品美女久久久m| 嫩草影院久久99| 人妻无码中文久久久久专区| 国产欧美久久久精品| 国内精品久久久久久99蜜桃 | 久久国产精品77777| 精品国产乱码久久久久软件| 久久久久国产| 久久婷婷五月综合色99啪ak| 99热热久久这里只有精品68| 国产成人精品久久二区二区| 久久成人精品视频| 久久亚洲国产午夜精品理论片| 中文精品久久久久人妻不卡| 免费久久人人爽人人爽av| 亚洲精品国产自在久久| 久久综合亚洲欧美成人| 国产欧美久久一区二区| 久久精品成人免费观看97| 久久伊人影视| AV无码久久久久不卡蜜桃| 久久av高潮av无码av喷吹| 亚洲精品国精品久久99热| 日本久久久久亚洲中字幕| 精品视频久久久久| 久久精品国产亚洲av影院| 亚洲精品无码久久久久AV麻豆| 久久久噜噜噜www成人网| 色婷婷久久久SWAG精品| 99麻豆久久久国产精品免费| 狠狠色婷婷久久一区二区三区| 亚洲国产一成久久精品国产成人综合| 久久久久久国产a免费观看不卡| 无码精品久久一区二区三区| 久久―日本道色综合久久| 精品久久8x国产免费观看| 综合久久国产九一剧情麻豆| 久久精品国产99久久久古代|