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アプリケーションでは、厳密な意味での本当のサーバとクライアントの区別はなくなりました。エンドポイントの間は平等な関係になりますので、通信はプログラムを作成するだけでいいです。
キー部分のコードと説明を以下に示す。
重要なグローバル変数
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
何が無接続で信頼できないですか?正直に言えば、データを送る時、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を使ってリアルタイムで通信していることを忘れないでください。以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。