ソース
ソースコードは以下の丸パクリで、ソースコードにコメントを入れたものになります。
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();
}