Visual C# UDP協(xié)議的收發(fā)實現(xiàn)
前面我們對UDP協(xié)議的面向鏈接問題進行了簡單的描述。這里我們主要介紹一下Visual C# UDP的主要類和使用方法。那么在C#中來完成UDP協(xié)議的數(shù)據(jù)發(fā)送、接收包使用等問題。讓我們一起看看主要內容吧。
Visual C# UDP數(shù)據(jù)的發(fā)送、接收包使用的主要類及其用法:
用Visual C# UDP協(xié)議的實現(xiàn),最為常用,也是最為關鍵的類就是UdpClient,UdpClient位于命名空間System.Net.Sockets中,Visual C# UDP數(shù)據(jù)包的發(fā)送、接收都是通過UdpClient類的。表01和表02是UdpClient類中常用方法和屬性及其簡要說明。
方法 說明 Close 關閉 UDP 連接 Connect 建立與遠程主機的連接 DropMulticastGroup 退出多路廣播組 JoinMulticastGroup 將 UdpClient 添加到多路廣播組 Receive 返回已由遠程主機發(fā)送的 UDP 數(shù)據(jù)文報 Send 將 UDP 數(shù)據(jù)文報發(fā)送到遠程主機。
屬性 說明 Active 獲取或設置一個值,該值指示是否已建立了與遠程主機的連接 Client 獲取或設置基礎網(wǎng)絡套接字 表02:UdpClient類中常用方法及其說明。
1.Visual C# UdpClient類發(fā)送UDP數(shù)據(jù)包:
在具體使用中,一般分成二種情況:
(1). 知道遠程計算機IP地址:
"Send"方法的調用語法如下:
- public int Send ( byte[] dgram , int bytes , IPEndPoint endPoint ) ;
參數(shù)說明:
dgram 要發(fā)送的 UDP 數(shù)據(jù)文報(以字節(jié)數(shù)組表示)。
bytes 數(shù)據(jù)文報中的字節(jié)數(shù)。
endPoint 一個 IPEndPoint,它表示要將數(shù)據(jù)文報發(fā)送到的主機和端口。
返回值 已發(fā)送的字節(jié)數(shù)。
下面使用UdpClient發(fā)送UDP數(shù)據(jù)包的具體的調用例子:
- IPAddress HostIP = new IPAddress.Parse ( "遠程計算機IP地址" ) ;
- IPEndPoint host = new IPEndPoint ( HostIP , 8080 ) ;
- UdpClient.Send ( "發(fā)送的字節(jié)" , "發(fā)送的字節(jié)長度" , host ) ;
(2). 知道遠程計算機名稱:
知道遠程計算機名稱后,利用"Send"方法直接把UDP數(shù)據(jù)包發(fā)送到遠程主機的指定端口號上了,這種調用方式也是最容易的,語法如下:
- public int Send ( byte[ ] dgram , int bytes , string hostname , int port ) ;
參數(shù)說明:
dgram 要發(fā)送的 UDP 數(shù)據(jù)文報(以字節(jié)數(shù)組表示)。
bytes 數(shù)據(jù)文報中的字節(jié)數(shù)。
hostname 要連接到的遠程主機的名稱。
port 要與其通訊的遠程端口號。
返回值 已發(fā)送的字節(jié)數(shù)。
2.Visual C# UdpClient類接收UDP數(shù)據(jù)包:
接收UDP數(shù)據(jù)包使用的是UdpClient中的“Receive"方法。此方法的調用語法如下:
- public byte [] Receive ( ref IPEndPoint remoteEP ) ;
參數(shù)說明:
remoteEP 是一個 IPEndPoint類的實例,它表示網(wǎng)絡中發(fā)送此數(shù)據(jù)包的節(jié)點。
如果指定了遠程計算機要發(fā)送到本地機的端口號,也可以通過偵聽本地端口號來實現(xiàn)對數(shù)據(jù)的獲取,下面就是通過偵聽本地端口號“8080"來獲取信息代碼:
- server = new UdpClient ( ) ;
- receivePoint = new IPEndPoint (new IPAddress ( "127.0.0.1" ) , 8080 ) ;
- byte[] recData = server.Receive ( ref receivePoint ) ;