• <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 。可以使用 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

            這里面東西概括性很強。
            亚洲精品NV久久久久久久久久 | 伊人久久大香线蕉AV一区二区| 久久久久女人精品毛片| 欧美国产成人久久精品| 久久久久亚洲AV无码观看 | 国产—久久香蕉国产线看观看| 日韩人妻无码精品久久免费一 | 精品久久久久久亚洲| 好久久免费视频高清| 日本久久久久久中文字幕| 7国产欧美日韩综合天堂中文久久久久| 99热成人精品免费久久| 久久久久亚洲精品中文字幕| 国内精品久久久人妻中文字幕| AV色综合久久天堂AV色综合在 | 91久久香蕉国产熟女线看| 青青青青久久精品国产| 精品无码久久久久久久动漫| 九九99精品久久久久久| 久久久精品人妻无码专区不卡| 久久伊人精品一区二区三区 | 久久久久久亚洲Av无码精品专口 | 国内精品久久久久影院网站| 久久美女人爽女人爽| 色综合合久久天天给综看| 久久精品一本到99热免费| 久久中文字幕视频、最近更新 | 亚洲一本综合久久| 久久精品天天中文字幕人妻| 狠狠狠色丁香婷婷综合久久俺| 久久免费99精品国产自在现线| 亚洲国产精品高清久久久| 色综合久久久久网| 久久精品国产亚洲AV电影| 少妇被又大又粗又爽毛片久久黑人| 亚洲AV成人无码久久精品老人| 国产呻吟久久久久久久92| 久久精品国产99久久无毒不卡| 麻豆国内精品久久久久久| 久久久久中文字幕| 国产 亚洲 欧美 另类 久久|