スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C#でUDP通信を行う

TCP通信が落ち着いたのでUDP通信にもとりかかった。

単発の送受信のサンプルはサクサク見つかるのだが、連続して受信するようなサンプルがなかなか見つからない。

MSDNにちょうどよいサンプルを発見

【使っている名前空間】
using System.Net.Sockets;
using System.Net;
using System.Threading;


【サンプル】
public static bool messageReceived = false;
public static void ReceiveCallback(IAsyncResult ar)
{
UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e;

Byte[] receiveBytes = u.EndReceive(ar, ref e);
string receiveString = Encoding.ASCII.GetString(receiveBytes);

Console.WriteLine("Received: {0}", receiveString);
messageReceived = true;
}

public static void ReceiveMessages()
{
// Receive a message and write it to the console.
IPEndPoint e = new IPEndPoint(IPAddress.Any, listenPort);
UdpClient u = new UdpClient(e);

UdpState s = new UdpState();
s.e = e;
s.u = u;

Console.WriteLine("listening for messages");
u.BeginReceive(new AsyncCallback(ReceiveCallback), s);

// Do some work while we wait for a message. For this example,
// we'll just sleep
while (!messageReceived)
{
Thread.Sleep(100);
}
}


public static void ReceiveCallback(IAsyncResult ar)
{
UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e;

Byte[] receiveBytes = u.EndReceive(ar, ref e);
string receiveString = Encoding.ASCII.GetString(receiveBytes);

Console.WriteLine("Received: {0}", receiveString);
messageReceived = true;
}



これは一回受信したら終わり。
受信したら次のスレッドを作成するようにReceiveCallbackの最後を作り変えれば永遠と受信してくれるようになる。

UdpStateは恐らく自作しなければならない

public class UdpState
{
public UdpClient u;
public IPEndPoint e;
}


UDPはストリーム系の受信と違い素直な挙動なのでコーディングは楽。
ルーターなどにより実験する環境を整えるほうが大変かもしれない(仕組みを勉強する点で)


ねよっと。

コメントの投稿

非公開コメント

承認待ちコメント

このコメントは管理者の承認待ちです
プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。