学习笔记(UDP应用编程)

作者在 2011-06-24 21:49:46 发布以下内容
UDP与TCP的区别:
1.UDP速度比TCP快
2.UDP有消息边界
3.UDP可以一对多传输
4.UDP可靠性不如TCP
5.UDP不能保证有序传输
UdpClient类:
提供发送和接收UDP数据报的方法。一种是使用远程主机名和端口号作为参数创建UdpClient类的实例;另一种先不创建不带参数的UdpClient类的实例,然后调用Connect()方法指定默认远程主机。
UdpClient的构造函数:
1.public UdpClient(int port);此构造函数创建一个基础Socket,自动分配合适的本地IPv4地址,并将基础Socket与指定的本地端口号绑定。
UdpClient udpClient = new UdpClient(51666);
UdpClient sendUdpClient= new UdpClient(0);0:表示让系统自动为其分配一个合适的端口号。
2.public UdpClient(IPEndPoint localEp);该实例与包含本地IP底子好和端口号的IPEndPoint实例绑定。
IPAddress address = Dns.GetHostAddresses(Dns.GetHostName())[0];
IPEndPoint iep = new IPEndPoint(address,51666);
UdpClient udpClient = new UdpClient(iep);
3.public UdpClient(string hostname,int port);自动分配合适的IP地址和端口号,用于收发数据,并使用hostname和port参数建立默认远程主机。
UdpClient udpClient = new UdpClient("www.contoso.com",11000);
4.public UdpClient();自动分配合适的本地IPv4地址和端口号,但是该构造函数不执行套接字绑定。
UdpClient udpCilent = new UdpClient();
udpClient.Connect("www.contoso.com",51666);
Byte[] sendBytes = Encoding.Unicode.GetBytes("你好!");
udpClient.Send(sendBytes,sendBytes.Length);
UdpClient的常用方法和属性:
名称
说明
Connect方法
建立默认远程主机。因为UDP是无连接,所以不会阻止调用该方法的线程。另外,如果打算接收多路广播数据报,不要调用Connect方法,否则从指定的默认地址以外的地址到达的任何数据报都将被丢弃。但是,如果在调用Send方法时指定了IPAddress.Broadcast,则可以将数据广播到默认的广播地址255.255.255.255
Send方法
发送数据报
Receive方法
接收数据报
BeginSend方法
开始从连接的socket中异步发送数据报
BeginReceive方法
开始从连接的socket中异步接收数据报
EndSend方法
结束挂起的异步发送数据报
EndReceive方法
结束挂起的异步接收数据报
JoinMulticaseGroup方法
添加多地址发送,用于连接一个多组播
DropMulticastGroup方法
除去多地址发送,用于断开UdpCilent与一个多组播的连接
Close方法
关闭UDP连接,禁用基础Socket,并释放与UdpClient关联的所有托管资源和非托管资源
Active属性
获取或设置一个值指示是否建立默认远程主机
Available属性
获取或设置缓冲器中可用数据报的数量
Client属性
获取或设置基础套接字
EnableBroadcast属性
是否接收或发送广播包
同步发送和接收数据:
1.发送数据:
1.public int Send(byte[] data,int length,IPEndPoint iep);将UDP数据报发送到位于指定远程端点主机。将数据报发送到广播,利用UdpClient的Client属性获取基础Socket,并将套接字选项设置为:SocketOptionName.Broadcast.
UdpClient udpClient = new UdpClient();
IPAddress remoteIPAddress = Dns.GetHostAddresses(Dns.GetHostName())[0];
IPEndPoint remoteIPEndPoint = new IPEndPoint(remoteIPAddress,51666);
byte[] sendbytes = Encoding.Unicode.GetBytes("你好!");
udpClient.Send(sendBytes,sendBytes.Length,remoteIPEndPoint);
2.public int Send(byte[] data,int length,string hostname,int port);将UDP数据报发送到指定的远程主机上的指定端口。如果将hostname参数值指定为:255.255.255.255,可将数据报发送到默认广播地址。
UdpClient udpClient = new UdpClient();
byte[] sendbytes = Encoding.Unicode.GetBytes("你好!");
udpClient.Send(sendBytes,sendBytes.Length,"www.abcd.com",51666);
3.public int Send(byte[] data,int length);将定已经通过Connect()方法指定了默认远程主机,只需发送数据和字节数。
UdpClient udpClient = new UdpClient();
byte[] sendbytes = Encoding.Unicode.GetBytes("你好!");
udpClient.Send(sendbytes,sendbytes.Length);
2.接收数据:
public byte[] Reveive(ref IPEndPoint remoteEP);IPEndPoint表示发送方的IP地址和端口号。
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any,0);IPAddress.Any表示对方的IP地址是任何IP地址,0表示对方的任何端口号。
例子:
UdpClient udpClient = new UdpClient(Dns.GetHostAddresses(Dns.GetHostName())[0],18001);
IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any,0);
try{
Byte[] receiveBytes = udpClient.Receive(ref remoteEndPoint);
string receiveData = Encoding.Unicode.GetString(receiveBytes);
Console.WriteLine("接收到信息:"+receiveData);
}catch(Exception ex){
MessageBox.Show(ex.ToString());
}
异步发送和接收数据:
1.发送数据:
1.利用IPEndPoint实例指定远程主机信息:
同步:Send(byte[] data ,int length,IPEndPoint iep);
异步:BeginSend(byte[] data,int length,IPEndPoint iep,AsyncCallback ac,Object obj);
2.直接指定远程主机名及端口号:
同步:Send(byte[] data,int length,string remoteHostName,int port);
异步:BeginSend(byte[] data,int length,string remoteHostName,int port,AsyncCallback ac,Object obj);
3.假定在调用Send方法之前已经建立了远程主机:
同步:Send(byte[] data,int length);
异步:BeginSend(byte[] data,int length,AsyncCallback ac,Object obj);
static void SendMessage(string server,string message)
{
UdpClient udpClient = new UdpClient(server,51666);
byte[] sendByte = Encoding.Unicode.GetBytes("你好!");
IAsyncResult result = udpClient.BeginSend(sendByte,sendByte.Length,null,null);
while(!result.IsCompleted)
{
Thread.Sleep(100);
}
int sendbytes = udpClient.EndSend(result);
}
2.接收数据:
public IAsyncResult BeginReceive(AsyncCallback requestCallback,Object state);
public byte[] EndReceive(IAsyncResult asyncReslut,ref IPEndPoint,remoteEP);
例子:
private void ReceiveData()
{
UdpClient receiveClient = new UdpClient(port);
receiveClient.BeginReceive(new AsyncCallback(ReceiveUdpClientCallback),receiveClient);
}
void ReceiveUdpClientCallback(IAsyncResult ar)
{
UdpClient u = (UdpClient)ar.AsyncState;
IPEndPoint remote = null;
Byte[] reveiveBytes = u.EndReceive(ar,ref remote);
string str = Encoding.UTF-8.GetString(receiveBytes,0,receiveBytes.Length);
}
广播:指同时向子网中的多台发送消息,并且所有子网不会受到本地广播的影响。
组播:又叫多路广播,将消息从一台计算机发送到本网或全网内选择的计算机子集上,即发送到那些加入指定组播组的计算上。
组播组是分享一个组播地址的一组设备,又称多路广播组。组播地址范围在244.0.0.0到239.255.255.255的D类IP地址。
使用组播时,注意TTL(生存周期)值的设置。
UdpClient udpClient = new UdpClient();
udpClient.Ttl = 50;
1.加入多路广播组:
1.JoinMulticastGroup(IPAddress multicastAddr);
//创建UdpClient的实例并设置使用的本地端口号
UdpClient udpClient = new UdpClient(8001);
udpClient.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"));
2.JoinMulticastGroup(IPAddress multicastAddr,int timeToLive);
UdpClient udpClient = new UdpClient(8001);
udpClient.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"),50);
2.退出多路广播组:
udpClient.DropMulticastGroup(IPAddress.Parse("224.100.0.1"));
C# | 阅读 6608 次
文章评论,共0条
游客请输入验证码