• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    深入 CSocket 編程之阻塞和非阻塞模式

    發布: 2008-10-13 11:35 | 作者: NorthTibet | 來源: vckbase | 查看: 226次 | 進入軟件測試論壇討論

    領測軟件測試網

    在 1 中已提到 Client/Server 端通信時, Server 端 socket 正在接收來自 Client 端 socket 連接請求,這將會觸發 FD_ACCEPT 事件,同時 Server 端的 網絡傳輸服務進程 向 Server 端的 socket window (CSocketWnd )發送事件通知消息 WM_SOCKET_NOTIFY , 通知有 FD_ACCEPT 事件產生 , CsocketWnd 在收到事件通知消息后,調用消息處理函數 OnSocketNotify:

    LRESULT CSocketWnd::OnSocketNotify(WPARAM wParam, LPARAM lParam)
    {
    CSocket::AuxQueueAdd(WM_SOCKET_NOTIFY, wParam, lParam);
    CSocket::ProcessAuxQueue();
    return 0L ;
    }

      消息參數 wParam 是 socket 的句柄, lParam 是 socket 事件 。這里稍作解釋一下,CSocketWnd 類是作為 CSocket 類的 友元類 ,這意味著它可以訪問 CSocket 類中的保護和私有成員函數和變量, AuxQueueAdd 和 ProcessAuxQueue 是 CSocket 類的靜態成員函數,如果你對友元不熟悉,請迅速找本有關 C++ 書看一下友元的使用方法吧!

      ProcessAuxQueue 是實質處理 socket 事件的函數,在該函數中有這樣一句代碼: CAsyncSocket* pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, TRUE);

      其實也就是由 socket 句柄得到發送事件通知消息的 socket 指針 pSocket:從 m_pmapSocketHandle 中查找!

      最后, WSAGETSELECTEVENT(lParam) 會取出事件類型,在一個簡單的 switch 語句中判斷事件類型并調用事件處理函數。在這里,事件類型是 FD_ACCEPT ,當然就調用 pSocket->OnAccept !

    結束語

      Server 端 socket 處于阻塞調用模式下,它必須在一個新創建的線程中工作,防止主線程被阻塞。

      當有多個 Client 端 socket 與 Server 端 socket 連接及通信時, Server 端采用阻塞模式就顯得不適合了,應該采用非阻塞模式 , 利用 socket 事件 的消息機制來接受多個 Client 端 socket 的連接請求并進行通信。

      在非阻塞模式下,利用 CSocketWnd 作為所有 sockets 的消息池,是實現 socket 事件 的消息機制的關鍵技術。文中存在用詞不妥和可能存在的技術問題,請大家原諒,也請批評指正,謝謝!

    注:

      當前模塊狀態——用于保存當前線程和模塊狀態的一個結構,可以通過 AfxGetThreadModule() 獲得。AFX_MODULE_THREAD_STATE 在 CSocket 重新定義為 _AFX_SOCK_THREAD_STATE 。

      socket 類型——在 TCP/IP 協議中, Client/Server 網絡程序采用 TCP 協議:即 socket 類型為 SOCK_STREAM ,它是可靠的連接方式。在這里不采用 UDP 協議:即 socket 類型為 SOCK_DGRAM ,它是不可靠的連接方式。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: CSocket 模式 阻塞

    33/3<123

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>