Maison  >  Article  >  développement back-end  >  Explication détaillée de l'exemple de code pour implémenter la communication du protocole UDP à l'aide du Socket de C#

Explication détaillée de l'exemple de code pour implémenter la communication du protocole UDP à l'aide du Socket de C#

黄舟
黄舟original
2017-03-23 11:57:012878parcourir

Cet article présente principalement l'exemple de code pour implémenter la communication du protocole UDP à l'aide de Socket en C# L'éditeur pense que c'est plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur pour y jeter un œil.

J'ai passé un peu de temps aujourd'hui à vérifier la communication UDP à l'aide de Socket C#, jetant ainsi les bases du prochain objectif de l'utilisation d'UDP pour créer un système de simulation de communication distribuée. Comme nous le savons tous, UDP est le protocole de datagramme utilisateur, qui est la quatrième couche du modèle de référence Internet - la couche de transport. Au même niveau que le protocole TCP, les deux fournissent des services de transmission d'informations, mais la plus grande différence avec TCP est qu'il s'agit d'une transmission d'informations sans connexion et peu fiable.

Qu'est-ce que le manque de fiabilité sans connexion ? Pour parler franchement, lors de l'envoi de données, il suffit de lancer le paquet UDP sur le réseau et c'est tout. Peu importe qu'il soit reçu ou non. Lors de la réception de données, s'il y a un paquet UDP envoyé au réseau local, il le sera. être accepté. Récupérez-les tous, puis voyez qui les a envoyés après les avoir récupérés. Par rapport à TCP, il n'est pas nécessaire de recourir à une série de processus tels que l'établissement d'une connexion, le maintien de la connexion et la libération de la connexion. Il présente donc les avantages d'une faible consommation de ressources et d'une vitesse de traitement rapide.

Maintenant que j'ai dit beaucoup de bêtises, commençons à parler de la façon d'utiliser Socket en C# pour la communication UDP. Les applications TCP et UDP peuvent être programmées via les classes TCPClient, TCPListener et UDPClient, et ces classes de protocole sont également basées sur la classe System.Net.Sockets.Socket, sans avoir à se soucier des détails de la transmission des données . Mais afin de mieux comprendre la programmation Socket, la classe Socket est toujours utilisée pour la programmation des communications UDP.

Dans les applications UDP, il n'y a plus de distinction entre un vrai serveur et un client au sens strict. Les points de terminaison sont tous égaux, il suffit donc d'écrire un programme pour communiquer.

Les éléments clés du code et de la description sont donnés ci-dessous :

Variables globales clés

private IPEndPoint ipLocalPoint; 
private EndPoint RemotePoint; 
private Socket mySocket; 
private bool RunningFlag = false;

Méthodes pour obtenir une adresse IP locale

private string getIPAddress() 
 { 
   // 获得本机局域网IP地址 
   IPAddress[] AddressList = Dns.GetHostByName(Dns.GetHostName()).AddressList; 
   if (AddressList.Length < 1) 
   { 
     return ""; 
   } 
   return AddressList[0].ToString(); 
 }

Vérification de l'adresse IP et du numéro de port valide

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; 
  }

Configuration du socket

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

Fil de réception

//定义一个委托 
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"); 
}

Ce qui précède doit uniquement définir l'adresse IP et le port locaux et distants numéros. Il est facile de mettre en œuvre une communication bidirectionnelle avec UDP. Bien que les paquets de données UDP ne puissent pas garantir une transmission fiable, l'encombrement du réseau, la congestion et d'autres facteurs peuvent empêcher les paquets de données d'atteindre la destination désignée. Mais après tests, sa communication est assez fiable. N'oubliez pas que QQ utilise également UDP pour la communication instantanée.


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn