LoginSignup
2
5

More than 3 years have passed since last update.

C# UDPブロードキャスト送受信

Last updated at Posted at 2020-09-22

ソース

ソースコードは以下の丸パクリで、ソースコードにコメントを入れたものになります。
https://www.it-swarm-ja.tech/ja/c%23/udp%E3%83%96%E3%83%AD%E3%83%BC%E3%83%89%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%A4%9C%E5%87%BA%E3%82%92%E8%A1%8C%E3%81%86%E6%96%B9%E6%B3%95/1046508993/

IPEndPoint / UdpClient

  • IPEndPoint
    エンドポイント(通信する口)の情報(IP アドレス / ポート番号)
  • UdpClient
    UDPの各種制御を行うためのコントローラのようなモノ

サーバ

クライアントからのリクエストをポート番号8888で待ち受け、
リクエスト受信が発生すると、送信元エンドポイントに対してレスポンスを返します。

static void Main(string[] args)
{
    var Server = new UdpClient(8888);                                       // 待ち受けポートを指定してUdpClient生成
    var ResponseData = Encoding.ASCII.GetBytes("SomeResponseData");         // 適当なレスポンスデータ

    while (true)
    {
        var ClientEp = new IPEndPoint(IPAddress.Any, 0);                    // クライアント(通信相手)のエンドポイントClientEp作成(IP/Port未指定)
        var ClientRequestData = Server.Receive(ref ClientEp);               // クライアントからのパケット受信、ClientEpにクライアントのエンドポイント情報が入る
        var ClientRequest = Encoding.ASCII.GetString(ClientRequestData);

        Console.WriteLine("Recived {0} from {1}, sending response", ClientRequest, ClientEp.Address.ToString());    // ClientEp.Address:クライアントIP
        Server.Send(ResponseData, ResponseData.Length, ClientEp);           // クライアント情報の入ったClientEpに対してパケット送信
    }
}

クライアント

ポート番号8888に対してリクエストをブロードキャスト送信し、
自身にレスポンスが返ってくるのを待ちます。

static void Main(string[] args)
{
    var Client = new UdpClient();                           // UdpClient作成(ポート番号は適当に割当)
    var RequestData = Encoding.ASCII.GetBytes("Request");   // 適当なリクエストデータ
    var ServerEp = new IPEndPoint(IPAddress.Any, 0);        // サーバ(通信相手)のエンドポイントServerEp作成(IP/Port未指定)

    Client.EnableBroadcast = true;                          // ブロードキャスト有効化
    Client.Send(RequestData, RequestData.Length, new IPEndPoint(IPAddress.Broadcast, 8888)); // ポート8888にブロードキャスト送信

    // 送信データを受信した相手は、自分(クライアント)のエンドポイント情報を知ったはずなので、
    // そこに対してパケットを送信してくれるのを待つ
    var ServerResponseData = Client.Receive(ref ServerEp);  // サーバからのパケット受信、ServerEpにサーバのエンドポイント情報が入る
    var ServerResponse = Encoding.ASCII.GetString(ServerResponseData);
    // ServerEp.Address / ServerEp.Port でサーバのIP/ポート番号を取得
    Console.WriteLine("Recived {0} from {1}:{2}", ServerResponse, ServerEp.Address.ToString(), ServerEp.Port.ToString());

    Client.Close();
}
2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5