ソース
ソースコードは以下の丸パクリで、ソースコードにコメントを入れたものになります。
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で待ち受け、
リクエスト受信が発生すると、送信元エンドポイントに対してレスポンスを返します。
staticvoidMain(string[]args){varServer=newUdpClient(8888);// 待ち受けポートを指定してUdpClient生成varResponseData=Encoding.ASCII.GetBytes("SomeResponseData");// 適当なレスポンスデータwhile(true){varClientEp=newIPEndPoint(IPAddress.Any,0);// クライアント(通信相手)のエンドポイントClientEp作成(IP/Port未指定)varClientRequestData=Server.Receive(refClientEp);// クライアントからのパケット受信、ClientEpにクライアントのエンドポイント情報が入るvarClientRequest=Encoding.ASCII.GetString(ClientRequestData);Console.WriteLine("Recived {0} from {1}, sending response",ClientRequest,ClientEp.Address.ToString());// ClientEp.Address:クライアントIPServer.Send(ResponseData,ResponseData.Length,ClientEp);// クライアント情報の入ったClientEpに対してパケット送信}}
クライアント
ポート番号8888に対してリクエストをブロードキャスト送信し、
自身にレスポンスが返ってくるのを待ちます。
staticvoidMain(string[]args){varClient=newUdpClient();// UdpClient作成(ポート番号は適当に割当)varRequestData=Encoding.ASCII.GetBytes("Request");// 適当なリクエストデータvarServerEp=newIPEndPoint(IPAddress.Any,0);// サーバ(通信相手)のエンドポイントServerEp作成(IP/Port未指定)Client.EnableBroadcast=true;// ブロードキャスト有効化Client.Send(RequestData,RequestData.Length,newIPEndPoint(IPAddress.Broadcast,8888));// ポート8888にブロードキャスト送信// 送信データを受信した相手は、自分(クライアント)のエンドポイント情報を知ったはずなので、// そこに対してパケットを送信してくれるのを待つvarServerResponseData=Client.Receive(refServerEp);// サーバからのパケット受信、ServerEpにサーバのエンドポイント情報が入るvarServerResponse=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();}