c-網(wǎng)絡編程-c-套接字編程_第1頁
c-網(wǎng)絡編程-c-套接字編程_第2頁
c-網(wǎng)絡編程-c-套接字編程_第3頁
c-網(wǎng)絡編程-c-套接字編程_第4頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

C#套接字編程c_網(wǎng)絡編程メー套接字編程主要內(nèi)容...NET網(wǎng)絡編程基本操作..同步通信開發(fā)同步服務器開發(fā)同步客戶機開發(fā)..異步通信開發(fā)異步服務器開發(fā)ー異步客戶機開發(fā)..TcpListener/TcpClient通信開發(fā)..UDP通信1.概述...NET環(huán)境下的網(wǎng)絡編程仍然是基于套接字的編程。..套接字編程接口使用了System.Net.Sockets名字空間。其提供的Socket類為Win32下的套接字的托管版本。...NET網(wǎng)絡編程提供了很多支持:Socket;TcpClient/UdpClient/TcpListener;WebRequest/WebResponse;HTTP/FTP/File+WebRequest/WebResponse等。.NET與Win32套接字對比.NetWin32Accept/BeginAccept/EndAcceptacceptBindbindCloseclosesockListenlistenSelectselectConnect/BeginConnect/EndConnectconnectGetSocketOption/SetSocketOptiongetsockopt/setsockoptReceive/BeginReceive/EndReceiverecvSend/BeginSend/EndSendsendReceiveFrom/BeginReceiveFrom/EndReceiveFromrecvfromSendTo/BeginSendTo/EndSendTosendtoShutdownshutdown.NET網(wǎng)絡中常用的類..Socket:實現(xiàn)Berkeley套接字接口;..Dns:提供簡單的域名解析功能;..IPAddress:提供網(wǎng)際協(xié)議(IP)地址:..IPEndPoint:將網(wǎng)絡端點表示為IP地址和端口號;..IPHostEntry:為Internet主機地址信息提供容器類;..Networkstream:提供用于網(wǎng)絡訪問的基礎(chǔ)數(shù)據(jù)流。..TcpLinster:從TCP網(wǎng)絡客戶端偵聽連接。..TcpClient:為TCP網(wǎng)絡服務提供客戶端連接..UdpClient:提供用戶數(shù)據(jù)報(UDP)網(wǎng)絡服務1.1.NET套接字概述..名字空間:System.Net.Sockets.Socket,System.Net命名空間中的所有其他網(wǎng)絡訪問類都建立在該套接字實現(xiàn)的基礎(chǔ)之上。..Socket類支持兩種基本模式:一同步:對執(zhí)行網(wǎng)絡操作的函數(shù)(如Send和Receive)的調(diào)用一直等到操作完成后オ將控制返回給調(diào)用程序。ー異步:網(wǎng)絡操作的函數(shù)調(diào)用立即返回。..Socket的構(gòu)造函數(shù)原型:ー參數(shù)1:指定Socket類用來解析網(wǎng)絡地址的標準址族(如:AddressFamily.InterNetwork成員指定IP版本4地址族)。ー參數(shù)2:指定套接字的類型(如:SocketType.Stream成員表示一個用于發(fā)送和接收數(shù)據(jù)并且支持流控制的標準套接字)。ー參數(shù)3:指定在Socket上通信時使用的網(wǎng)絡協(xié)議(如:ProtocolType.Tcp指示套接字使用TCP)。2.1TCP/UDP套接字構(gòu)造??構(gòu)造TCP套接字..構(gòu)造UDP套接字套接字的常用屬性..Socket常用屬性:Blocking:設置或者獲取套接字阻塞模式;Connected:獲取當前套接字是否與遠程主機相連;LocalEndPoint:得到套接字的本地EndPoint對象;RemoteEndPoint:得到套接字的遠程EndPoint對象;SocketType:套接字類型。套接字的常用方法..Socket常用同步的方法:Accept;Bind;Close;Connect;Disconnect;Listen;Receive/ReciveFrom;Select;Send/SendTo/SendFile;SetSocketOption/GetSocketOption;Shutdown;說明:紅色的方法有對應的異步方法。?.創(chuàng)建套接字后:?在客戶端,通過Connect方法連接到指定的服務器,并通過Send/SendTo或者Receive/ReceiveFrom從服務端接收數(shù)據(jù);ー在服務器端,使用Bind方法綁定所指定的接口使Socket與一個本地終結(jié)點相聯(lián),并通過Listen方法偵聽該接口上的請求,當偵聽到用戶端的連接時,調(diào)用Accept完成連接的操作,創(chuàng)建新的Socket以處理傳入的連接請求。ー使用完Socket后,使用Shutdown方法結(jié)束通信,并使用Close方法關(guān)閉Socketo..上面的是同步方式的通信,還有相對應的異步的Begin/End連接與通信方式。..套接字服務器的綁定端點需要使用到Socket.Bind()方法。..在調(diào)用Bind之前,必先創(chuàng)建本地IPEndPointo可以用IPAddress.Any作為地址參數(shù)創(chuàng)建一個IPEndPoint,這樣,將會使用所有可能的網(wǎng)絡地址。..通過調(diào)用LocalEndPoint獲知所分配的本地網(wǎng)絡地址和端口號。..Socket.Listen()將套接字置于監(jiān)聽狀態(tài)。-backlog掛起連接隊列的最大長度。1.2.5SetSocketOption..設置或者取消套接字的對應的屬性。ー參數(shù)1:可以是Socket,IP,TCP,UDP;ー參數(shù)2:各種與參數(shù)1對應的屬性,如:Broadcast,RecevieBuffer,ReceiveTimeout等待。ー參數(shù)3:true/falseotrue一使能;false一取消。L3地址/端口信息?.TCP/IP使用ー個網(wǎng)絡地址和一個服務端ロ號來唯一標識設備。-網(wǎng)絡地址標識網(wǎng)絡上的特定設備;?端口號標識要連接到的該設備上的特定服務。..網(wǎng)絡地址和服務端口的組合稱為網(wǎng)絡端點,它在?NET中由EndPoint類表示。對于IP地址族,該類為IPEndPointo1.3.UPEndPoint使用..構(gòu)造函數(shù)兩種:,,其!PEndPoint的使用..問題:在Win32中記錄IP地址和端口信息是使用的什么?..IPAddress在System.Net名字空間中。..它包含計算機在IP網(wǎng)絡上的地址相關(guān)操作和屬性。..根據(jù)字符串獲取IPAddress信息:Parse();..提供的常用地址:Any;Broadcast;Loopback;None;1.3.3主機解析..Dns類是ー個靜態(tài)類,它從域名系統(tǒng)中檢索關(guān)于特定主機的信息。..IPHostEntry類將主機名、別名和一組匹配的IP地址關(guān)聯(lián)。常和Dns類ー起使用。..在!PHostEntry類的實例中返回來自DNS查詢的主機信息。如果指定的主機在數(shù)據(jù)庫中有多個入口,則IPHostEntry包含多個IP地址和別名。..問題:在Win32中記錄地址和機器名信息是使用的什么?3.4主機解析用法..Dns.Resove用于解析主機名到!PHostEntryo..使用:5Dns類常用方法..GetHostName()可以獲得主機名。..GetHostByName()方法根據(jù)主機名向DNS服務器查詢主機信息。..GetHostByAddress()方法根據(jù)地址信息查詢主機信息。1.3.6示例1——地址信息.?士?.6:1.3.7e.ay2.a.all.i°t...4-1.3.7示例2——構(gòu)造服務器..+..0:Win32ao.''."2C°6,"d...,t...4-iX.dX.u.£...Win32如何創(chuàng)建并綁定一個服務器套接字的?1.4出錯/異常信息..SocketException用來拋出Socket相關(guān)異常信息。..當網(wǎng)絡發(fā)生錯誤時,Socket和Dns引發(fā)SocketException〇..使用SocketException.ErrorCode可以獲取特定的錯誤代碼,Message可以獲得錯誤消息。2.同步服務器/客戶機..討論ー種常見網(wǎng)絡服務器模式:?同步阻塞服務器:-同步阻塞客戶機;??和Win32下的阻塞模型類似,對每ー個接受的請求產(chǎn)生新的線程,并在此線程中完成所有的與客戶機的數(shù)據(jù)交互。2.1同步阻塞服務器開發(fā)..這是使用起來最簡單的一種模型。.?任何時候調(diào)用ー個綁定!/O的.NET套接字方法,如果套接字上沒有等候處理的數(shù)據(jù),該調(diào)用就會阻塞。..如果需要做其他的事情,或者為其它的連接請求提供服務,就需要在應用程序中創(chuàng)建額外的線程。..和Win32下的阻塞模型類似。同步阻塞模型2.1.1同步Accept..其函數(shù)定義:..Accept以同步方式從偵聽套接字的連接請求隊列中提取第一個掛起的連接請求,然后創(chuàng)建并返回新的Socketo..此處使用Socket.RemoteEndPoint來獲取連接機器的IP和端口信息。..問題:Win32中何處獲取請求連接機器的地址和端口信息?同步Accept接受連接..在阻止模式中,Accept將一直處于阻止狀態(tài),直到傳入的連接嘗試排入隊列。連接被接受后,原來的Socket繼續(xù)將傳入的連接請求排入隊列,直到您關(guān)閉它。1.2同步Send發(fā)送數(shù)據(jù)??將數(shù)據(jù)發(fā)送到連接的Socket:..SocketFlags通常使用SocketFlags.None?發(fā)送字節(jié)數(shù)的默認值為緩沖區(qū)的大小。..Send對面向連接的協(xié)議和無連接協(xié)議均適用。同步Send注意事項..如果您使用的是面向連接的協(xié)議,則除非使用Socket.SendTimeout設置了超時值,否則,Send將一直處于阻止狀態(tài),直到發(fā)送完緩沖區(qū)中的所有字節(jié)。..應由應用程序負責跟蹤已發(fā)送的字節(jié)數(shù)并重試操作,直到應用程序發(fā)送完想要發(fā)送的緩沖區(qū)中的字節(jié)數(shù)為止。..不能保證發(fā)送的數(shù)據(jù)會立即出現(xiàn)在網(wǎng)絡上。為提高網(wǎng)絡效率,基礎(chǔ)系統(tǒng)可能會延遲傳輸,直到收集了足夠多的傳出數(shù)據(jù)后オ開始發(fā)送。1.3同步Receive發(fā)送數(shù)據(jù)..從Socket中接收數(shù)據(jù)(常用第3個):..Receive方法將數(shù)據(jù)讀入第一個參數(shù)中,并返回成功讀取的字節(jié)數(shù)。第一個int是接收多少數(shù)據(jù)到緩沖區(qū),第二個int是指明緩沖區(qū)的偏移量。..如果沒有可讀取的數(shù)據(jù),則Receive方法將ー直處于阻止狀態(tài),直到數(shù)據(jù)可用,除非使用ReceiveTimeout設置了超時值。如果超過超時值,Receive調(diào)用將引發(fā)SocketException。同步Send/Receive示例2.1.4另一種方式收發(fā)數(shù)據(jù)..System.Net.Sockets.Networkstream提供了用于網(wǎng)絡訪問的基礎(chǔ)數(shù)據(jù)流。..Networkstream提供的Write和Read方法用于簡單的單線程同步阻止I/0o..另外Networkstream還提供異步的發(fā)送和接收數(shù)據(jù)的方法:-BeginWrite/EndWrite-BeginRead/EndReadWrite發(fā)送數(shù)據(jù)..Write函數(shù)定義:ー參數(shù)1:byte數(shù)組,包含即將寫入到Networkstream的數(shù)據(jù)。ー參數(shù)2:buffer中開始寫入數(shù)據(jù)的位置。-參數(shù)3:準備寫入Networkstream的字節(jié)數(shù)。Read接收數(shù)據(jù)..函數(shù)定義:ー參數(shù)1:用于存儲從Networkstream讀取的數(shù)據(jù)。?參數(shù)2:buffer中的開始存放數(shù)據(jù)的偏移量。ー參數(shù)3:buffer長度。ー返回值:成功讀取的字節(jié)數(shù)。Write/Read 示例..客戶機需要通過三次握手完成到服務器的連接。.NET環(huán)境提供了同步Connect函數(shù)完成到服務器的連接。..TCP連接中Connect方法會同步建立LocalEndPoint與指定遠程終結(jié)點之間的網(wǎng)絡連接,同時保存本地地址和端口信息。..遠程結(jié)點的信息存放在Socket.RemoteEndPoint中。..客戶機與服務器的通信也是使用Send/Receive或Networkstream的Read/Write完成。2.2.1客戶機Connect...NET環(huán)境下常使用的Connect原型有:..其中后面兩個為?NET2.0新增。..使用示例:2.3服務器/客戶機示例??服務器(多線程同步阻塞服務器,為每ー個客戶新建一個線程來處理):-FirstNetwork.csproj??客戶機:-ClientNetwork.csproj3.異步服務器/客戶機..在.NET套接字中,異步模型是用在ー個或者多個套接字上管理I/O的最佳途徑。..因為異步模型采用的和Win32下的完成端口模型類似,而且在NT系統(tǒng)中,其內(nèi)部實現(xiàn)上使用了完成端口I/O模型,因此是最有效率的ー種。..回憶:Win32下有那些I/O模型?服務器為Pentinum41.7GXeon,內(nèi)存768M,100M網(wǎng)絡,系統(tǒng)WinXP..C#有多種常用的異步調(diào)用步驟,其中有兩種分別是:ー進行某些操作,然后調(diào)用Endlnvoke一直阻塞到調(diào)用完成。-將用于回調(diào)方法的委托傳遞給Beginlnvokeo該方法在異步調(diào)用完成后在ThreadPool線程上執(zhí)行,它可以調(diào)用Endlnvoke。..代碼:Asyn-1.csAsyn-4.cs..前面提到幾種用來異步處理的I/O方法:BeginAccept/EndAccept;BeginConnect/EndConnect;BeginReceive/EndReceive;BeginSend/EndSend;BeginReciveFrom/EndReceiveFrom;BeginSendTo/EndSendTo;一都是有Accept、Connect>Receive、Send等都是增加了一對BeginXXX/EndXXX..異步套接字使用系統(tǒng)線程池中的線程處理傳入的連接。.一些線程負責接受連接,另一些線程用于處理每個傳入的連接,還有一些線程負責接收連接數(shù)據(jù)。這些線程可以是同一個線程,具體取決于線程池所分配的線程。..System.Threading.ManualResetEvent類掛起主線程的執(zhí)行并在執(zhí)行可以繼續(xù)時發(fā)出信號。?異步調(diào)用的執(zhí)行上下文(安全上下文、模擬用戶及調(diào)用上下文)會被.NET環(huán)境緩存,以用于Socket異步方法。..在首次使用ー個特定上下文(特定Socket異步方法、特定Socket實例及特定回調(diào))后,該上下文的后續(xù)使用將得到性能改善。..要異步調(diào)用ー個I/O方法,必須調(diào)用與同步方法中對應的方法“BeginXXX”,并在它的調(diào)用中提供一個回調(diào)方法。..BeginXXX調(diào)用完成后,調(diào)用線程可以繼續(xù)做其它事情,而提供的回調(diào)方法則會去處理I/O讀寫。..在回調(diào)方法內(nèi)部,當Socket完成I/O操作后,可以使用對等的EndXXX來獲取完成的I/O果。3.6IAsyncResult接口..lAsyncResult接ロ由包含可異步操作的方法的類實現(xiàn)。..它是啟動異步操作的方法的返回類型,如BeginAccept?也是結(jié)束異步操作的方法的參數(shù)的類型,如EndAccepto..lAsyncResult也將傳遞給由AsyncCallback委托調(diào)用的方法。它的AsyncState屬性能夠獲取用戶定義的對象,就是在BeginXXX中傳入的Object對象。..BeginAccept/EndAccept原型:-AsynCallback:指明回調(diào)方法,異步執(zhí)行體;-Object:ー個包含此請求的狀態(tài)信息的對象:-lAsynResult:存儲此異步操作的狀態(tài)信息以及任何用戶定義數(shù)據(jù)。-EndAccept:返回連接客戶機的套接字。..為開始接受網(wǎng)絡連接請求,其步驟如下:1)初始化Socket,并完成綁定和監(jiān)聽。2)使用BeginAccept方法開始接受新連接。3)當套接字上接收到新連接請求時,將調(diào)用接受回調(diào)方法。4)回調(diào)方法通過EndAccept來獲取處理客戶機連接請求的Socket句柄,并將該Socket提交給將處理請求的線程?;卣{(diào)方法實現(xiàn)AsyncCallback委托;它返回void,并帶ー個lAsyncResult類型的參數(shù)。??將數(shù)據(jù)異步的發(fā)送到連接的Sockets..BeginSend/EndSend原型:..參數(shù)說明:buffer:存放發(fā)送數(shù)據(jù)的緩沖區(qū);offset:緩沖區(qū)中準備發(fā)送的數(shù)據(jù)的開始處:size:發(fā)送數(shù)據(jù)的長度;sockFlags:Socket相關(guān)標識,常用0;callback:指明回調(diào)方法;state:ー個包含此請求的狀態(tài)信息的對象;lAsynResult:存儲此異步操作的狀態(tài)信息;EndSend:返回成功發(fā)送的數(shù)據(jù)長度。..BeginSend方法可對在Connect、BeginConnect、Accept或BeginAccept方法中建立的遠程主機啟動異步發(fā)送操作。..如果沒有首先調(diào)用AcceptBeginAccept、Connect或BeginConnect,貝リBeginSend將會引發(fā)異常。..調(diào)用BeginSend方法將使您能夠在單獨的執(zhí)行線程中發(fā)送數(shù)據(jù)。回調(diào)方法 AsyncCallback..創(chuàng)建一個實現(xiàn)AsyncCallback委托的回調(diào)方法并將它的名稱傳遞給BeginSend方法。?.因此,state參數(shù)至少必須包含用于通信的已連接或默認Socket。如果回調(diào)需要更多信息,則可以創(chuàng)建一個小型類或結(jié)構(gòu),用于保存Socket和其他所需的信息。通過state參數(shù)將此類的ー個實例傳遞給BeginSend方法。..回調(diào)方法應調(diào)用EndSend方法。..當應用程序調(diào)用BeginSend時,系統(tǒng)將使用ー個單獨的線程來執(zhí)行指定的回調(diào)方法,并阻止EndSend,直到Socket發(fā)送了請求的字節(jié)數(shù)或引發(fā)了異常為止。..如果希望在調(diào)用BeginSend方法之后使原始線程阻止,請使用WaitHandle.WaitOne方法。當需要原始線程繼續(xù)執(zhí)行時,請在回調(diào)方法中調(diào)用System.Threading.ManualResetEvent的Set方法。3.9常用異步方法一Receive..BeginReceive/EndReceive原型:常用異步方法一Receive..參數(shù)說明:buffer:存放接收數(shù)據(jù)的緩沖區(qū);offset:緩沖區(qū)中準備接收的數(shù)據(jù)的開始處:size:緩沖區(qū)的長度;sockFlags:Socket相關(guān)標識,常用0;callback:指明回調(diào)方法;state:ー個包含此請求的狀態(tài)信息的對象;lAsynResult:它存儲此異步操作的狀態(tài)信息以及所有用戶定義數(shù)據(jù)。EndReceive:返回成功接收的數(shù)據(jù)長度。異步接收方法使用..異步BeginReceive操作必須通過調(diào)用EndReceive方法來完成。通常,該方法由callback委托調(diào)用。..在EndReceive調(diào)用中會返回接收到的數(shù)據(jù)長度,接收到的數(shù)據(jù)填充在由BeginReceive中傳入的緩沖區(qū)中。3.10常用異步方法一Connect..BeginConnect/EndConnect原型:常用異步方法一Connect..參數(shù)說明:remoteEP:目標的地址和IP信息;callback:回調(diào)方法state:ー個包含此請求的狀態(tài)信息的對象;lAsynResult:它存儲此異步操作的狀態(tài)信息以及所有用戶定義數(shù)據(jù)。3.11完整示例..異步服務器:-Server,csproj??異步客戶機:-Client,csproj4.TcpListener/TcpClient..應用程序可以通過TCPClient>TCPListener類來使用傳輸控制協(xié)議(TCP)服務。..TcpListener類提供ー些簡單方法,用于在同步模式下偵聽和接受傳入連接請求??墒褂肨cpClient或Socket來連接TcpListener。.?要使用異步Socket方法,可以使用Networkstream類提供的異步方法。Networkstream也支持同步的數(shù)據(jù)讀寫。4.ITcpListener..可使用IPEndPoint,本地IP地址及端口號或者僅使用端口號,來創(chuàng)建TcpListener。..TcpListerner.Start方法用來開始偵聽傳入的連接請求。Start將對傳入連接進行排隊,直至您調(diào)用Stop方法或它已經(jīng)完成MaxConnections排隊為止。..可使用AcceptSocket或AcceptTcpClient從傳入連接請求隊列提取連接。..TcpClient類用于在同步阻止模式下通過網(wǎng)絡來連接、發(fā)送和接收流數(shù)據(jù)。..為使TcpClient連接并交換數(shù)據(jù),可以使用下面兩種方法之一連接到該服務器端:-創(chuàng)建一個TcpClient,并調(diào)用三個可用的Connect方法之一,〇ー使用遠程主機的主機名和端口號創(chuàng)建TcpCliento此構(gòu)造函數(shù)將自動嘗試ー個連接。..服務器:-TcpLinstener.cs??客戶機:-TcpClient.cs4.4TcpListener.Pending..publicboolPending();..用于確定是否有到來的連接請求。-有:返回true;ー沒有:返冋false;4.5服務端的線程池??線程池使用系統(tǒng)的ThreadPool對象來處理連接請求。..托管線程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論