In diesem Artikel wird hauptsächlich der Beispielcode von C#s Socket zur Implementierung der UDP-Protokollkommunikation vorgestellt. Der Herausgeber findet ihn recht gut, daher werde ich ihn jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Editor, um einen Blick darauf zu werfen.
Ich habe heute ein wenig Zeit damit verbracht, die UDP-Kommunikation mit dem Socket von C# zu überprüfen und damit den Grundstein für ein verteiltes Kommunikationssimulationssystem mit UDP zu legen. Wie wir alle wissen, ist UDP das User Datagram Protocol, das die vierte Schicht des Internet-Referenzmodells ist – die Transportschicht. Auf derselben Ebene wie das TCP-Protokoll stellen beide Informationsübertragungsdienste bereit. Der größte Unterschied zu TCP besteht jedoch darin, dass es sich um eine verbindungslose und unzuverlässige Informationsübertragung handelt.
Was ist Unzuverlässigkeit ohne Verbindung? Um es ganz klar auszudrücken: Wenn Sie Daten senden, senden Sie einfach das UDP-Paket an das Netzwerk. Es spielt keine Rolle, ob es beim Empfang von Daten ein UDP-Paket sendet Sammeln Sie sie alle ein und sehen Sie dann, wer sie gesendet hat, nachdem Sie sie abgeholt haben. Im Vergleich zu TCP ist keine Reihe von Prozessen wie Handshake zum Herstellen einer Verbindung, Aufrechterhalten der Verbindung und Freigeben der Verbindung erforderlich, sodass die Vorteile eines geringen Ressourcenverbrauchs und einer schnellen Verarbeitungsgeschwindigkeit bestehen. Nachdem ich nun viel Unsinn gesagt habe, fangen wir an, darüber zu sprechen, wie man Socket in C# für die UDP-Kommunikation verwendet. TCP- und UDP-Anwendungen können über die Klassen TCPClient, TCPListener und UDPClient Bei UDP-Anwendungen gibt es keinen Unterschied mehr zwischen einem echten Server und einem Client im engeren Sinne. Die Endpunkte sind alle gleich, Sie müssen also nur ein Programm schreiben, um zu kommunizieren. Die wichtigsten Teile des Codes und der Beschreibung sind unten aufgeführt: Wichtige globale Variablenprivate IPEndPoint ipLocalPoint; private EndPoint RemotePoint; private Socket mySocket; private bool RunningFlag = false;
private string getIPAddress() { // 获得本机局域网IP地址 IPAddress[] AddressList = Dns.GetHostByName(Dns.GetHostName()).AddressList; if (AddressList.Length < 1) { return ""; } return AddressList[0].ToString(); }
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; }
//得到本机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();
//定义一个委托 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"); }
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung des Beispielcodes zur Implementierung der UDP-Protokollkommunikation mithilfe des Sockets von C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!