Heim >Backend-Entwicklung >C#.Net-Tutorial >Ausführliche Erläuterung des Beispielcodes zur Implementierung der UDP-Protokollkommunikation mithilfe des Sockets von C#

Ausführliche Erläuterung des Beispielcodes zur Implementierung der UDP-Protokollkommunikation mithilfe des Sockets von C#

黄舟
黄舟Original
2017-03-23 11:57:013006Durchsuche

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

programmiert werden. Diese Protokollklassen basieren auch auf der Klasse System.Net.Sockets.Socket, ohne dass Sie sich um die Details der Datenübertragung kümmern müssen . Um die Socket-Programmierung besser zu verstehen, wird die Socket-Klasse jedoch weiterhin für die UDP-Kommunikationsprogrammierung verwendet.

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 Variablen

private IPEndPoint ipLocalPoint; 
private EndPoint RemotePoint; 
private Socket mySocket; 
private bool RunningFlag = false;
Methoden zum Erhalten lokaler IP

private string getIPAddress() 
 { 
   // 获得本机局域网IP地址 
   IPAddress[] AddressList = Dns.GetHostByName(Dns.GetHostName()).AddressList; 
   if (AddressList.Length < 1) 
   { 
     return ""; 
   } 
   return AddressList[0].ToString(); 
 }
Überprüfung der IP-Adresse und der gültigen Portnummer

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-Konfiguration

//得到本机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();
Empfangsthread

//定义一个委托 
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"); 
}
Oben müssen nur die lokale und Remote-IP und der Port festgelegt werden Mit UDP ist es einfach, eine bidirektionale Kommunikation zu implementieren. Obwohl UDP-Datenpakete keine zuverlässige Übertragung garantieren können, können Netzwerkauslastung, Überlastung und andere Faktoren verhindern, dass Datenpakete das vorgesehene Ziel erreichen. Nach dem Test ist die Kommunikation jedoch recht zuverlässig. Vergessen Sie nicht, dass QQ auch UDP für die sofortige Kommunikation verwendet.



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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn