亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mfc教程_ 14socket類的設計和實現.htm

?? 一本優秀的vc程序學習教程,希望能夠幫助大家學習
?? HTM
?? 第 1 頁 / 共 3 頁
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0042)http://www.vczx.com/tutorial/mfc/mfc14.php -->
<HTML><HEAD><TITLE>MFC教程_ SOCKET類的設計和實現</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff>
<OL start=14>
  <P align=justify>
  <LI><A name=_Toc452641014></A><A name=_Toc457299154></A><B>SOCKET類的設計和實現</B> 
  <P></P>
  <OL>
    <P align=justify>
    <LI><B><A name=_Toc452641015></A><A name=_Toc457299155></A>WinSock基本知識</B> 
    <P></P>
    <P align=justify>這里不打算系統地介紹socket或者WinSock的知識。首先介紹WinSock 
    API函數,講解阻塞/非阻塞的概念;然后介紹socket的使用。</P>
    <OL>
      <P align=justify>
      <LI><A name=_Toc452641016></A><A name=_Toc457299156></A><B>WinSock API</B> 

      <P></P>
      <P 
      align=justify>Socket接口是網絡編程(通常是TCP/IP協議,也可以是其他協議)的API。最早的Socket接口是Berkeley接口,在Unxi操作系統中實現。WinSock也是一個基于Socket模型的API,在Microsoft 
      Windows操作系統類中使用。它在Berkeley接口函數的基礎之上,還增加了基于消息驅動機制的Windows擴展函數。Winscok1.1只支持TCP/IP網絡,WinSock2.0增加了對更多協議的支持。這里,討論TCP/IP網絡上的API。</P>
      <P align=justify>Socket接口包括三類函數:</P>
      <P align=justify>第一類是WinSock API包含的Berkeley 
      socket函數。這類函數分兩部分。第一部分是用于網絡I/O的函數,如</P>
      <P 
      align=justify>accept、Closesocket、connect、recv、recvfrom、Select、Send、Sendto</P>
      <P align=justify>另一部分是不涉及網絡I/O、在本地端完成的函數,如</P>
      <P 
      align=justify>bind、getpeername、getsockname、getsocketopt、htonl、htons、inet_addr、inet_nton</P>
      <P 
      align=justify>ioctlsocket、listen、ntohl、ntohs、setsocketopt、shutdow、socket等</P>
      <P align=justify>第二類是檢索有關域名、通信服務和協議等Internet信息的數據庫函數,如</P>
      <P 
      align=justify>gethostbyaddr、gethostbyname、gethostname、getprotolbyname</P>
      <P align=justify>getprotolbynumber、getserverbyname、getservbyport。</P>
      <P align=justify>第三類是Berkekley 
      socket例程的Windows專用的擴展函數,如gethostbyname對應的WSAAsynGetHostByName(其他數據庫函數除了gethostname都有異步版本),select對應的WSAAsynSelect,判斷是否阻塞的函數WSAIsBlocking,得到上一次Windsock 
      API錯誤信息的WSAGetLastError,等等。</P>
      <P 
      align=justify>從另外一個角度,這些函數又可以分為兩類,一是阻塞函數,一是非阻塞函數。所謂阻塞函數,是指其完成指定的任務之前不允許程序調用另一個函數,在Windows下還會阻塞本線程消息的發送。所謂非阻塞函數,是指操作啟動之后,如果可以立即得到結果就返回結果,否則返回表示結果需要等待的錯誤信息,不等待任務完成函數就返回。</P>
      <P align=justify>首先,異步函數是非阻塞函數;</P>
      <P align=justify>其次,獲取遠地信息的數據庫函數是阻塞函數(因此,WinSock提供了其異步版本);</P>
      <P align=justify>在Berkeley socket函數部分中,不涉及網絡I/O、本地端工作的函數是非阻塞函數;</P>
      <P align=justify>在Berkeley 
      socket函數部分中,網絡I/O的函數是可阻塞函數,也就是它們可以阻塞執行,也可以不阻塞執行。這些函數都使用了一個socket,如果它們使用的socket是阻塞的,則這些函數是阻塞函數;如果它們使用的socket是非阻塞的,則這些函數是非阻塞函數。</P>
      <P 
      align=justify>創建一個socket時,可以指定它是否阻塞。在缺省情況下,Berkerley的Socket函數和WinSock都創建“阻塞”的socket。阻塞socket通過使用select函數或者WSAAsynSelect函數在指定操作下變成非阻塞的。WSAAsyncSelect函數原型如下。</P>
      <P align=justify>int WSAAsyncSelect( </P>
      <P align=justify>SOCKET s, </P>
      <P align=justify>HWND hWnd, </P>
      <P align=justify>u_int wMsg, </P>
      <P align=justify>long lEvent </P>
      <P align=justify>);</P>
      <P 
      align=justify>其中,參數1指定了要操作的socket句柄;參數2指定了一個窗口句柄;參數3指定了一個消息,參數4指定了網絡事件,可以是多個事件的組合,如:</P>
      <P align=justify>FD_READ 準備讀</P>
      <P align=justify>FD_WRITE 準備寫</P>
      <P align=justify>FD_OOB 帶外數據到達</P>
      <P align=justify>FD_ACCEPT 收到連接</P>
      <P align=justify>FD_CONNECT 完成連接</P>
      <P align=justify>FD_CLOSE 關閉socket。</P>
      <P align=justify>用OR操作組合這些事件值,如FD_READ|FD_WRITE</P>
      <P align=justify>WSAAsyncSelect函數表示對socket 
      s監測lEvent指定的網絡事件,如果有事件發生,則給窗口hWnd發送消息wMsg。</P>
      <P align=justify>假定應用程序的一個socket 
      s指定了監測FD_READ事件,則在FD_READ事件上變成非阻塞的。當read函數被調用時,不管是否讀到數據都馬上返回,如果返回一個錯誤信息表示還在等待,則在等待的數據到達后,消息wMsg發送給窗口hWnd,應用程序處理該消息讀取網絡數據。</P>
      <P 
      align=justify>對于異步函數的調用,以類似的過程最終得到結果數據。以gethostbyname的異步版本的使用為例進行說明。該函數原型如下:</P>
      <P align=justify>HANDLE WSAAsyncGetHostByName( </P>
      <P align=justify>HWND hWnd, </P>
      <P align=justify>u_int wMsg, </P>
      <P align=justify>const char FAR *name, </P>
      <P align=justify>char FAR *buf, </P>
      <P align=justify>int buflen </P>
      <P align=justify>);</P>
      <P 
      align=justify>在調用WSAAsyncGetHostByName啟動操作時,不僅指定主機名字name,還指定了一個窗口句柄hWnd,一個消息ID 
      wMsg,一個緩沖區及其長度。如果不能立即得到主機地址,則返回一個錯誤信息表示還在等待。當要的數據到達時,WinSock 
      DLL給窗口hWnd發送消息wMsg告知得到了主機地址,窗口過程從指定的緩沖區buf得到主機地址。</P>
      <P 
      align=justify>使用異步函數或者非阻塞的socket,主要是為了不阻塞本線程的執行。在多進程或者多線程的情況下,可以使用兩個線程通過同步手段來完成異步函數或者非阻塞函數的功能。</P>
      <P align=justify></P>
      <LI><A name=_Toc452641017></A><A name=_Toc457299157></A><B>Socket的使用</B> 
      <P></P></LI></OL></LI></OL></LI></OL>
<P align=justify>WinSock以DLL的形式提供,在調用任何WinSock 
API之前,必須調用函數WSAStartup進行初始化,最后,調用函數WSACleanUp作清理工作。</P>
<P 
align=justify>MFC使用函數AfxSocketInit包裝了函數WSAStartup,在WinSock應用程序的初始化函數IninInstance中調用AfxSocketInit進行初始化。程序不必調用WSACleanUp。</P>
<P align=justify></P>
<P 
align=justify>Socket是網絡通信過程中端點的抽象表示。Socket在實現中以句柄的形式被創建,包含了進行網絡通信必須的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議端口,遠地主機的IP地址,遠地進程的協議端口。</P>
<P 
align=justify>要使用socket,首先必須創建一個socket;然后,按要求配置socket;接著,按要求通過socket接收和發送數據;最后,程序關閉此socket。</P>
<UL>
  <P align=justify>
  <LI>為了創建socket,使用socket函數得到一個socket句柄: 
  <P></P></LI></UL>
<P align=justify>socket_handle = socket(protocol_family. Socket_type, 
protocol);</P>
<P 
align=justify>其中:protocol_family指定socket使用的協議,取值PF_INET,表示Internet(TCP/IP)協議族;Socket_type指socket面向連接或者使用數據報;第三個參數表示使用TCP或者UDP協議。</P>
<P 
align=justify>當一個socket被創建時,WinSock將為一個內部結構分配內存,在此結構中保存此socket的信息,到此,socket連接使用的協議已經確定。</P>
<UL>
  <P align=justify>
  <LI>創建了socket之后,配置socket。 
  <P></P></LI></UL>
<P 
align=justify>對于面向連接的客戶,WinSock自動保存本地IP地址和選擇協議端口,但是必須使用connect函數配置遠地IP地址和遠地協議端口:</P>
<P align=justify>result = connect(socket_handle, remote_socket_address, 
address_length)</P>
<P 
align=justify>remote_socket_address是一個指向特定socket結構的指針,該地址結構為socket保存了地址族、協議端口、網絡主機地址。</P>
<P align=justify>面向連接的服務器則使用bind指定本地信息,使用listen和accept獲取遠地信息。</P>
<P align=justify>使用數據報的客戶或者服務器使用bind給socket指定本地信息,在發送或者接收數據時指定遠地信息。</P>
<P align=justify>bind給socket指定一個本地IP地址和協議端口,如下:</P>
<P align=justify>result = bind( socket_hndle, local_socket_address, 
address_length)</P>
<P align=justify>參數類型同connect。</P>
<P 
align=justify>函數listen監聽bind指定的端口,如果有遠地客戶請求連接,使用accept接收請求,創建一個新的socket,并保存信息。</P>
<P align=justify>socket_new = accept(socket_listen, socket_address, 
address_length)</P>
<UL>
  <P align=justify>
  <LI>在socket配置好之后,使用socket發送或者接收數據。 
  <P></P></LI></UL>
<P align=justify>面向連接的socket使用send發送數據,recv接收數據;</P>
<P align=justify>使用數據報的socket使用sendto發送數據,recvfrom接收數據。</P>
<OL>
  <OL>
    <P align=justify>
    <LI><A name=_Toc452641018></A><A name=_Toc457299158></A><B>MFC對WinSockt 
    API的封裝</B> 
    <P></P>
    <P align=justify>MFC提供了兩個類CAsyncSocket和CSocket來封裝WinSock 
    API,這給程序員提供了一個更簡單的網絡編程接口。</P>
    <P align=justify>CAsyncSocket在較低層次上封裝了WinSock 
    API,缺省情況下,使用該類創建的socket是非阻塞的socket,所有操作都會立即返回,如果沒有得到結果,返回WSAEWOULDBLOCK,表示是一個阻塞操作。</P>
    <P 
    align=justify>CSocket建立在CAsyncSocket的基礎上,是CAsyncSocket的派生類。也就是缺省情況下使用該類創建的socket是非阻塞的socket,但是CSocket的網絡I/O是阻塞的,它在完成任務之后才返回。CSocket的阻塞不是建立在“阻塞”socket的基礎上,而是在“非阻塞”socket上實現的阻塞操作,在阻塞期間,CSocket實現了本線程的消息循環,因此,雖然是阻塞操作,但是并不影響消息循環,即用戶仍然可以和程序交互。</P>
    <OL>
      <P align=justify>
      <LI><A name=_Toc452641019></A><A 
      name=_Toc457299159></A><B>CAsyncSocket</B> 
      <P></P>
      <P align=justify>CAsyncSocket封裝了低層的WinSock 
      API,其成員變量m_hSocket保存其對應的socket句柄。使用CAsyncSocket的方法如下:</P>
      <P align=justify>首先,在堆或者棧中構造一個CAsyncSocket對象,例如:</P>
      <P align=justify>CAsyncSocket sock;或者</P>
      <P align=justify>CAsyncSocket *pSock = new CAsyncSocket;</P>
      <P align=justify>其次,調用Create創建socket,例如:</P>
      <P align=justify>使用缺省參數創建一個面向連接的socket</P>
      <P align=justify>sock.Create() </P>
      <P align=justify>指定參數參數創建一個使用數據報的socket,本地端口為30</P>
      <P align=justify>pSocket.Create(30, SOCK_DGRM);</P>
      <P align=justify>其三,如果是客戶程序,使用Connect連接到遠地;如果是服務程序,使用Listen監聽遠地的連接請求。</P>
      <P align=justify>其四,使用成員函數進行網絡I/O。</P>
      <P align=justify>最后,銷毀CAsyncSocket,析構函數調用Close成員函數關閉socket。</P>
      <P align=justify></P>
      <P align=justify>下面,分析CAsyncSocket的幾個函數,從中可以看到它是如何封裝低層的WinSock 
      API,簡化有關操作的;還可以看到它是如何實現非阻塞的socket和非阻塞操作。</P>
      <P align=justify></P>
      <LI><A name=_Toc452641020></A><A 
      name=_Toc457299160></A><B>socket對象的創建和捆綁</B> 
      <P></P>
      <P align=justify>(1)Create函數</P>
      <P 
      align=justify>首先,討論Create函數,分析socket句柄如何被創建并和CAsyncSocket對象關聯。Create的實現如下:</P>
      <P align=justify>BOOL CAsyncSocket::Create(UINT nSocketPort, int 
      nSocketType,</P>
      <P align=justify>long lEvent, LPCTSTR lpszSocketAddress)</P>
      <P align=justify>{</P>
      <P align=justify>if (Socket(nSocketType, lEvent))</P>
      <P align=justify>{</P>
      <P align=justify>if (Bind(nSocketPort,lpszSocketAddress))</P>
      <P align=justify>return TRUE;</P>
      <P align=justify>int nResult = GetLastError();</P>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99精品欧美一区二区三区综合在线| 亚洲欧美日韩国产另类专区| 蜜臀av一区二区在线免费观看| 3atv一区二区三区| 美女一区二区视频| 久久久久国产精品麻豆| 成人激情动漫在线观看| 亚洲三级在线免费观看| 欧美色倩网站大全免费| 久久国产精品72免费观看| 欧美高清在线视频| 色婷婷精品久久二区二区蜜臀av| 亚洲777理论| 26uuu国产一区二区三区| 北条麻妃国产九九精品视频| 亚洲自拍与偷拍| 精品国产伦一区二区三区观看方式| 国产一区二区三区四| 亚洲色图19p| 日韩欧美第一区| 91欧美一区二区| 全部av―极品视觉盛宴亚洲| 国产日韩精品视频一区| 日本道在线观看一区二区| 日韩电影在线一区| 国产精品区一区二区三| 国产精品国产自产拍高清av王其| 亚洲第一狼人社区| 国产成人亚洲综合色影视| 国产美女一区二区三区| 成人毛片老司机大片| 欧美电影免费提供在线观看| 亚洲一区二区三区视频在线播放| 粉嫩13p一区二区三区| 欧美性欧美巨大黑白大战| 2021久久国产精品不只是精品| 亚洲一区中文日韩| 99视频精品全部免费在线| 日韩视频一区二区| 亚洲成人av资源| 大白屁股一区二区视频| 日本一区二区成人在线| 亚洲成人av福利| 日韩精品一区在线观看| 性感美女久久精品| 精品中文字幕一区二区| 日韩一区二区三区观看| 欧美色图在线观看| 99久久国产综合色|国产精品| 日韩欧美你懂的| 在线看日本不卡| 国产a级毛片一区| 久久99精品一区二区三区| 亚洲最快最全在线视频| 国产精品美女久久久久久久久| 欧美一区二区精品久久911| 欧美亚洲国产一卡| 99精品欧美一区二区蜜桃免费| 国产一区二区精品久久| 久久国产福利国产秒拍| 日韩不卡一区二区三区| 婷婷亚洲久悠悠色悠在线播放| 亚洲黄色在线视频| 亚洲素人一区二区| 国产精品久久久久四虎| 国产精品网站在线观看| 国产精品欧美久久久久无广告 | 日韩欧美一区在线| 黄页视频在线91| 国产精品久久久久一区二区三区 | 99久久99久久精品免费看蜜桃| 国产精品污www在线观看| 91丨九色丨黑人外教| 亚洲男帅同性gay1069| 91精品国产综合久久香蕉麻豆 | 久久精品国产精品青草| 制服.丝袜.亚洲.中文.综合| 亚洲成av人片在线观看| 久久精品欧美一区二区三区麻豆| 久久综合视频网| 亚洲国产日韩在线一区模特| av中文字幕一区| 欧美性生活久久| 精品视频在线免费| 欧美久久久一区| 日韩视频一区二区在线观看| 精品国产91亚洲一区二区三区婷婷| 日韩精品一区二区在线| 久久精品亚洲精品国产欧美kt∨ | 中文一区二区在线观看| 国产精品午夜春色av| 亚洲天堂免费看| 亚洲一区二区三区小说| 日韩精品色哟哟| 国产日产亚洲精品系列| 日韩一级二级三级精品视频| 欧美日韩一区二区三区不卡| 欧美日韩dvd在线观看| 91视频在线观看免费| 色域天天综合网| 色妞www精品视频| 欧美在线观看一二区| 在线欧美日韩精品| 欧美日韩在线免费视频| 91高清在线观看| 欧美亚洲国产怡红院影院| 欧美日韩一区三区四区| 4438成人网| 久久蜜桃av一区精品变态类天堂| 久久香蕉国产线看观看99| 制服丝袜av成人在线看| 91精品国产一区二区人妖| 久久精品网站免费观看| 亚洲日本va午夜在线影院| 国产一区视频在线看| 国产激情偷乱视频一区二区三区| 综合自拍亚洲综合图不卡区| 亚洲欧洲精品天堂一级| 亚洲精品成人天堂一二三| 精彩视频一区二区| 亚洲精品久久嫩草网站秘色| 国产一区不卡视频| 国产精品另类一区| 亚洲123区在线观看| 国产一区三区三区| 欧美日韩一区二区欧美激情| 国产亚洲欧洲一区高清在线观看| 亚洲成av人**亚洲成av**| 国产盗摄精品一区二区三区在线 | 日本午夜一本久久久综合| 成人av网站在线观看| 欧美一区二区三区免费在线看| 国产精品妹子av| 激情综合五月天| 欧美久久久一区| 夜夜嗨av一区二区三区四季av| 国产资源在线一区| 9191国产精品| 亚洲精品福利视频网站| 成人亚洲精品久久久久软件| 日韩欧美一区二区在线视频| 亚洲国产综合色| 91色九色蝌蚪| 一区二区中文字幕在线| 激情综合色综合久久综合| 欧美麻豆精品久久久久久| 亚洲人成亚洲人成在线观看图片| 国产精品12区| 久久这里只有精品视频网| 日本欧美一区二区三区乱码| 91日韩精品一区| 亚洲人吸女人奶水| gogogo免费视频观看亚洲一| 国产蜜臀av在线一区二区三区| 久久成人精品无人区| 欧美精品亚洲二区| 午夜伦理一区二区| 欧美日韩高清不卡| 亚洲va国产天堂va久久en| 欧美日韩中字一区| 婷婷开心激情综合| 欧美日韩精品一二三区| 午夜av一区二区三区| 717成人午夜免费福利电影| 午夜影院在线观看欧美| 精品视频色一区| 五月婷婷综合在线| 欧美一区二区高清| 六月丁香综合在线视频| 日韩欧美不卡在线观看视频| 久久69国产一区二区蜜臀| 欧美mv和日韩mv的网站| 精品亚洲国内自在自线福利| 亚洲精品一区二区三区在线观看| 久久精品国产**网站演员| 精品国产91九色蝌蚪| 国产91精品一区二区麻豆亚洲| 国产欧美视频一区二区| 成人h版在线观看| 亚洲精品国产无天堂网2021| 欧美在线综合视频| 免费人成网站在线观看欧美高清| 日韩欧美一级在线播放| 国产精品一区二区你懂的| 日本一区二区电影| 欧美中文一区二区三区| 青青草97国产精品免费观看无弹窗版| 日韩欧美一区二区视频| 粉嫩av一区二区三区在线播放| 亚洲六月丁香色婷婷综合久久| 欧美日韩免费一区二区三区| 日本va欧美va精品| 国产精品免费看片| 欧美人与z0zoxxxx视频| 韩日欧美一区二区三区| 亚洲欧美国产三级| 日韩欧美国产精品一区| 成人av手机在线观看| 亚洲国产日韩一区二区| 久久亚洲综合av|