C〓〓のソケットはUDPプロトコル通信の例コードを実現します。


今日は少し時間がかかりました。C〓のSocketを利用してUDPの通信を検証しました。次にUDPを利用して分散式の通信シミュレーションシステムを作ります。周知のように、UDPはユーザデータ報プロトコルであり、インターネットの参照モデルの第四層であるトランスポート層である。TCPプロトコルと同じ層では、情報を提供するトランスポートサービスですが、TCPとの最大の違いは、接続がない信頼性のない情報伝送です。
何が無接続で信頼できないですか?正直に言えば、データを送る時、UDPカバンをネットに捨てればいいです。送信されたものを受け取るかどうかは無視します。データを受け取る時、地元のUDPカバンを配ったら全部受け取ります。受け取ったら誰が送ったのか見てください。TCPに比べて、握手を少なくして接続を確立して、接続を維持して、接続の釈放などの一連の過程を放して、そのためとても小さい資源の消耗と処理のスピードの速い美点を持ちます。
はい、無駄話をたくさんして、C菗中ソケットを使ってUDP通信をする方法を話し始めました。TCP、UDPアプリケーションは、TCPClient、TCPListens、UDPClientクラスを通じてプログラムされ、これらのプロトコルクラスもSystem.Net.Sockets.Socket類に基づいて構築され、データ転送の詳細は無視されます。しかし、Socketプログラミングをよりよく理解するために、ここではやはりSocket類を利用してUDP通信プログラミングを行います。
 UDPアプリケーションでは、厳密な意味での本当のサーバとクライアントの区別はなくなりました。エンドポイントの間は平等な関係になりますので、通信はプログラムを作成するだけでいいです。
キー部分のコードと説明を以下に示す。
重要なグローバル変数

private IPEndPoint ipLocalPoint; 
private EndPoint RemotePoint; 
private Socket mySocket; 
private bool RunningFlag = false; 
ローカルIPの取得方法

private string getIPAddress() 
 { 
   //        IP   
   IPAddress[] AddressList = Dns.GetHostByName(Dns.GetHostName()).AddressList; 
   if (AddressList.Length < 1) 
   { 
     return ""; 
   } 
   return AddressList[0].ToString(); 
 } 
IPとポート番号の有効検証

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() + "
"); 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() + "
"); 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 + "
"); }
以上はローカルとリモートのIPとポート番号を設定するだけで、UDPの双方向通信が容易に実現できます。UDPパケットは信頼できる伝送が保証されていませんが、ネットワークが忙しく、混雑などの要因で、指定された目的地にデータパケットが到達するのを阻止する可能性があります。しかしテストを経て、その通信はかなり信頼できています。QQもUDPを使ってリアルタイムで通信していることを忘れないでください。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。