Socket を利用した通信で UDP 送受信 を行う サンプルコード を掲載します。
Socket 通信 でも 正統派 コード、ここでは UDP通信 でも Socket クラス を用いた 同期処理 および 非同期処理 の サンプルコード を掲載します。
目次
UDP 同期 送受信
UDP 同期 受信 (サーバー)
正統派はこちらの実装なんでしょうか…
ただただ面倒な実装なので、個人的には UdpClient の方が好みです。
public void ListenMessage()
{
// 接続ソケットの準備
var socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
var local = new IPEndPoint(IPAddress.Any, 8000);
var remote = new IPEndPoint(IPAddress.Any, 8000) as EndPoint;
socket.Bind(local);
while (true)
{
var buffer = new byte[1024];
// 受信待機
var length = socket.ReceiveFrom(buffer, ref remote);
// 受信したデータを変換
var data = Encoding.UTF8.GetString(buffer);
// Receive イベント を実行
this.OnRecieve(data);
}
}
private void OnRecieve(string data)
{
// 受信したときの処理
}
UDP 同期 送信 (クライアント)
正統派はこちらの実装なんでしょうか…
ただただ面倒な実装なので、個人的には UdpClient の方が好みです。
public void SendMessage()
{
// 送信元の作成
// ※設定しなくても良いが…ポート指定するときは必要
var local = new IPEndPoint (
IPAddress.Parse("192.168.0.2"),
8000);
// 宛先の作成
var remote = new IPEndPoint (
IPAddress.Parse("192.168.0.100"),
8000);
// メッセージの準備
var message = Encoding.UTF8.GetBytes("Hello world !");
// UDPでメッセージ送信
var socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
socket.Bind(local); // ローカルアドレス、ポート番号を指定。
socket.SendTo(message, remote); // 同期処理で送信。送信し終わるまで処理が止まる。
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
UDP 非同期 送受信
UDP 非同期 受信 (サーバー)
public void ListenMessage()
{
// 接続先、接続元情報
var local = new IPEndPoint(IPAddress.Any, 8000);
var remote = new IPEndPoint(IPAddress.Any, 8000) as EndPoint;
// 接続ソケットの準備
var socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
socket.Bind(local);
// 受信イベントデータを生成
var e = new SocketAsyncEventArgs();
e.RemoteEndPoint = remote;
e.SetBuffer(0, 1024);
e.Completed += this.OnReceiveCompleted;
// 受信待機
socket.ReceiveFromAsync(e);
}
private void OnReceiveCompleted(object sender, SocketAsyncEventArgs e)
{
// 受信したデータを変換
var data = Encoding.UTF8.GetString(e.Buffer);
// 受信した処理
// ...
// 再度受信ループへ
this.ListenMessage();
}
UDP 非同期 送信 (クライアント)
public void SendMessage()
{
// 送信元の作成
// ※設定しなくても良いが…ポート指定するときは必要
var local = new IPEndPoint(
IPAddress.Parse("192.168.86.1"),
8000);
// 宛先の作成
var remote = new IPEndPoint(
IPAddress.Parse("192.168.86.113"),
8000);
// メッセージの準備
var message = Encoding.UTF8.GetBytes("Hello world !");
// 送信イベントデータ
var e = new SocketAsyncEventArgs();
e.RemoteEndPoint = remote;
e.SetBuffer(message, 0, message.Length);
// UDP送信
var socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
socket.Bind(local); // ローカルアドレス、ポート番号を指定。
socket.SendToAsync(e); // 同期処理で送信。送信し終わるまで処理が止まる。
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!