C#之UDP编程

使用C#编程是比较简单的,UDP协议不介绍,下面讲一下编程。

UDP编程使用的是UdpClient类,新建一个UdpClient对象,绑定到特定的端口,就可以进行发送和接收了。

不同的UdpClient绑定的端口不能一样,这个端口用于接收信息。但是,发送和接收使用的端口可以一样,也就是你使用了同一个对象。


创建对象

使用指定的端口时:

UdpClient udpClient = new UdpClient(11000);

使用随机的端口时:

UdpClient udpClient = new UdpClient(0);

使用随机端口进行发送,每次发出去的信息端口号码都是不同的,这样接收方要把信息发回来,就没办法了。


指定接收IP

发送的时候创建一个结点,来指定接收方的IP

IPEndPoint remoteIpEndPoint= new IPEndPoint(IPAddress.Broadcast, port_send);

                    remoteIpEndPoint = new IPEndPoint(IPAddress.Parse(ip_send), port_send);

udp_rec.Send(sendbytes, sendbytes.Length, remoteIpEndPoint);


接收信息

接收信息一般是利用线程进行处理

udp_rec = new UdpClient(port_rec);
receiveThread = new Thread(ReceiveMessage);
receiveThread.Start();



发送内容是Byte格式,使用ASCII进行编码

Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");
udpClient.Send(sendBytes, sendBytes.Length);

 private void ReceiveMessage()
        {
            IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
            while (true)
            {
                try
                {                  
                    byte[] receiveBytes = udp_rec.Receive(ref remoteIpEndPoint);
                    string message = Encoding.UTF8.GetString(receiveBytes);
                    // 显示消息内容
                    listBox_rec.Items.Add(string.Format("{0}[{1}]", remoteIpEndPoint, message));
                    listBox_rec.SelectedIndex = listBox_rec.Items.Count - 1;                
                }
                catch
                {
                   break;
                }
            }
        
        }




如何获取本机IP地址?

有一个问题,就是我们需要获得本机的IP地址,在Win7下默认启用了IPv6,上面这段代码返回的是IPv6格式的地址,而且根据系统情况不同,IPv4不能确定存放在数组的哪一个下标中。

下面提供一段代码,用于获取本机的IPv4地址:

public static string GetLocalIP()
{
	try
	{
		string HostName = Dns.GetHostName(); //得到主机名
		IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
		for (int i = 0; i < IpEntry.AddressList.Length; i++)
		{
			//从IP地址列表中筛选出IPv4类型的IP地址
			//AddressFamily.InterNetwork表示此IP为IPv4,
			//AddressFamily.InterNetworkV6表示此地址为IPv6类型
			if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
			{
				return IpEntry.AddressList[i].ToString();
			}
		}
		return "";
	}
	catch (Exception ex)
	{
		MessageBox.Show("获取本机IP出错:" + ex.Message);
		return "";
	}
}

最后大家注意的是消息的编码,编码和解码必须一样。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值