質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Q&A

解決済

1回答

5468閲覧

C# UDP通信でIPアドレス・ポート番号指定で読み込む

wanko1230

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

0グッド

0クリップ

投稿2020/05/26 08:11

前提・実現したいこと

複数の対向PCと個別に通信を行いたい
対向PC毎にプロセス(EXE)を立ち上げる
この時複数の対向PCとポート番号を別々に実行したい
UDP通信で行いたい
言語:C#
Windows10

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

C#

1namespace UDPtest 2{ 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 //バインドするローカルIPとポート番号 8// string localIpString = "127.0.0.1"; 9 string localIpString = "10.1.151.2"; 10 System.Net.IPAddress localAddress = 11 System.Net.IPAddress.Parse(localIpString); 12 int localPort = 2000; 13 14 //UdpClientを作成し、ローカルエンドポイントにバインドする 15 System.Net.IPEndPoint localEP = 16 new System.Net.IPEndPoint(localAddress, localPort); 17 System.Net.Sockets.UdpClient udp = 18 new System.Net.Sockets.UdpClient(localEP); 19 20 string TaiIpString = "10.1.150.201"; 21 System.Net.IPAddress TaiAddress = 22 System.Net.IPAddress.Parse(TaiIpString); 23 int TaiPort = 2000; 24 25 for (;;) 26 { 27 //データを受信する 28 // System.Net.IPEndPoint remoteEP = null; 29 System.Net.IPEndPoint remoteEP = new System.Net.IPEndPoint(TaiAddress, TaiPort); 30 byte[] rcvBytes = udp.Receive(ref remoteEP); 31 32 //データを文字列に変換する 33 string rcvMsg = System.Text.Encoding.UTF8.GetString(rcvBytes); 34 35 //受信したデータと送信者の情報を表示する 36 Console.WriteLine("受信したデータ:{0}", rcvMsg); 37 Console.WriteLine("送信元アドレス:{0}/ポート番号:{1}", 38 remoteEP.Address, remoteEP.Port); 39 40 //"exit"を受信したら終了 41 if (rcvMsg.Equals("exit")) 42 { 43 break; 44 } 45 } 46 47 //UdpClientを閉じる 48 udp.Close(); 49 50 Console.WriteLine("終了しました。"); 51 Console.ReadLine(); 52 } 53 } 54} 55 56

試したこと

byte[] rcvBytes = udp.Receive(ref remoteEP);
ここで指定したIPとポート番号のデータのみが取り込めると思ったが
関係なく取り込んでしまう。

補足情報(FW/ツールのバージョンなど)

Visual C# 2015 00322-20000-00000-AA845
Microsoft Visual C# 2015

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

UdpClient.Receive(IPEndPoint) メソッド
こちらにある通り、remoteEPはデータの送信元のリモート ホストを表す IPEndPointとなります。

ですので、特定のIPからのみ受信したいのであれば

C#

1System.Net.IPEndPoint TaiEP = new System.Net.IPEndPoint(TaiAddress, TaiPort); 2byte[] rcvBytes = udp.Receive(ref remoteEP); 3 4if(remoteEP.Equals(TaiEP)) 5{ 6 // 受信データを使った処理 7}

といった感じでremoteEPから目的のIP、Portからの受信なのか判断するようにしてください。

投稿2020/05/26 08:36

YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wanko1230

2020/05/26 11:15

回答ありがとうございます。 やはり、受信してから振り分けないと駄目でしょうか。 違うポートに外部から複数の端末と別々に通信をします。 こちらも別々のプロセス(exe)を実行します。 プロセス1.exe(ポート番号1000[送信]1001[受信])<=>端末1(IP10.1.1.1,ポート番号2000[送信]2001[受信]) プロセス2.exe(ポート番号1002[送信]1003[受信])<=>端末2(IP10.1.1.2,ポート番号2000[送信]2001[受信]) プロセス3.exe(ポート番号1004[送信]1005[受信])<=>端末3(IP10.1.1.2,ポート番号2000[送信]2001[受信]) のように独立して繋げようと思います。 これは無理でしょうか?
YAmaGNZ

2020/05/26 12:03

それで何が問題になるのでしょうか? 自分が作る物が「プロセス」と言っているものですよね? 自分の受信ポートに送られてきたデータによって何かしらを送り返すってことですよね? プロセス1のポート1001に対して端末3から送信された場合ってことですか?
wanko1230

2020/05/27 01:41

勘違いしてました、UDPだからすべてのポートのデータをどこからでも取り込めると思い込んでいました。 当然ですね、自分でIPとポート番号を指定して受信しているのですからそれ以外を受け取ることはないです。 ボケていました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問