This article mainly introduces the C# Socket implementation UDP protocol communication sample code. The editor thinks it is quite good. Now I will share it with you and give it as a reference. Let’s follow the editor to take a look.
I spent a little time today to verify the UDP communication using C#’s Socket, laying the foundation for the next purpose of using UDP to build a distributed communication simulation system. As we all know, UDP is the User Datagram Protocol, which is the fourth layer of the Internet reference model - the transport layer. At the same layer as the TCP protocol, both provide information transmission services, but the biggest difference from TCP is that it is a connectionless and unreliable information transmission.
What is connectionless unreliability? To put it bluntly, when sending data, just throw the UDP packet to the network and that's it. It doesn't matter whether it is received or not. When receiving data, if there is a UDP packet sent to the local, it will be accepted. Collect them all, and then see who sent them after you collect them. Compared with TCP, there is no need for a series of processes such as handshaking to establish a connection, maintaining the connection, and releasing the connection, so it has the advantages of small resource consumption and fast processing speed.
Okay, after talking a lot of nonsense, let’s start talking about how to use Socket in C# for UDP communication. TCP and UDP applications can be programmed through the TCPClient, TCPListener and UDPClient classes, and these protocol classes are also based on the System.Net.Sockets.Socket class, without having to worry about the details of data transmission. But in order to better understand Socket programming, the Socket class is still used for UDP communication programming.
In UDP applications, there is no longer a distinction between real servers and clients in the strict sense. The endpoints are all equal, so you only need to write a program to communicate.
The key parts of the code and description are given below:
Key global variables
private IPEndPoint ipLocalPoint; private EndPoint RemotePoint; private Socket mySocket; private bool RunningFlag = false;
Method to obtain local IP
private string getIPAddress() { // 获得本机局域网IP地址 IPAddress[] AddressList = Dns.GetHostByName(Dns.GetHostName()).AddressList; if (AddressList.Length < 1) { return ""; } return AddressList[0].ToString(); }
IP and port number valid verification
private int getValidPort(string port) { int lport; //测试端口号是否有效 try { //是否为空 if (port == "") { throw new ArgumentException( "端口号无效,不能启动DUP"); } lport = System.Convert.ToInt32(port); } catch (Exception e) { //ArgumentException, //FormatException, //OverflowException Console.WriteLine("无效的端口号:" + e.ToString()); this.tbMsg.AppendText("无效的端口号:" + e.ToString() + "\n"); return -1; } return lport; } private IPAddress getValidIP(string ip) { IPAddress lip = null; //测试IP是否有效 try { //是否为空 if (!IPAddress.TryParse(ip, out lip)) { throw new ArgumentException( "IP无效,不能启动DUP"); } } catch (Exception e) { //ArgumentException, //FormatException, //OverflowException Console.WriteLine("无效的IP:" + e.ToString()); this.tbMsg.AppendText("无效的IP:" + e.ToString() + "\n"); return null; } return lip; }
Socket configuration
//得到本机IP,设置UDP端口号 ip = getValidIP(tbLocalIP.Text); port = getValidPort(tbLocalPort.Text); ipLocalPoint = new IPEndPoint(ip, port); //定义网络类型,数据连接类型和网络协议UDP mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //绑定网络地址 mySocket.Bind(ipLocalPoint); //得到客户机IP ip = getValidIP(tbRemoteIP.Text); port = getValidPort(tbRemotePort.Text); IPEndPoint ipep = new IPEndPoint(ip, port); RemotePoint = (EndPoint)(ipep); //启动一个新的线程,执行方法this.ReceiveHandle, //以便在一个独立的进程中执行数据接收的操作 RunningFlag = true; Thread thread = new Thread(new ThreadStart(this.ReceiveHandle)); thread.Start();
Receive thread
//定义一个委托 public delegate void MyInvoke(string strRecv); private void ReceiveHandle() { //接收数据处理线程 string msg; byte[] data=new byte[1024]; MyInvoke myI = new MyInvoke(UpdateMsgTextBox); while (RunningFlag) { if (mySocket == null || mySocket.Available < 1) { Thread.Sleep(200); continue; } //跨线程调用控件 //接收UDP数据报,引用参数RemotePoint获得源地址 int rlen = mySocket.ReceiveFrom(data, ref RemotePoint); msg = Encoding.Default.GetString(data, 0, rlen); tbMsg.BeginInvoke(myI, new object[]{RemotePoint.ToString() + " : " + msg}); } } private void btSend_Click(object sender, EventArgs e) { string msg; msg = tbSendMsg.Text; //发送UDP数据包 byte[] data = Encoding.Default.GetBytes(msg); mySocket.SendTo(data, data.Length, SocketFlags.None, RemotePoint); } private void UpdateMsgTextBox(string msg) { //接收数据显示 this.tbMsg.AppendText( msg + "\n"); }
The above only needs to set the local and remote IP and port numbers, and it is easy to realize two-way communication of UDP. Although UDP data packets cannot guarantee reliable transmission, network busyness, congestion and other factors may prevent data packets from reaching the designated destination. But after testing, its communication is quite reliable. Don't forget that QQ also uses UDP for instant communication.
The above is the detailed content of Detailed explanation of the sample code for implementing UDP protocol communication using C#'s Socket. For more information, please follow other related articles on the PHP Chinese website!