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

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

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

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

UDP

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

9034閲覧

unityでUDP通信の送信をしたい

UKAWATAKATO

総合スコア14

C#

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

UDP

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/08/29 05:59

編集2018/08/30 02:13

課題で
今回悩んでいたところ
上司がUDP通信のソースを作ってきてくれました
このソースは受信と送信を同時に行っているんでしょうか?
見てもあんまり意味がわかりませんでした
ただ16進数にしなくちゃいけないが10進数になっているといわれました。

using

1using System.Collections.Generic; 2using UnityEngine; 3using System.Net; 4using System.Net.Sockets; 5using System.Threading; 6 7public class UdpSocket : MonoBehaviour 8{ 9 private string _MulticastAddr = "224.0.23.0"; // マルチキャストアドレス 10 private string _RemoteHost = ""; // 送信相手アドレス 11 private int _SendPort = 3610; // 送信ポート 12 private int _RecvPort = 3610; // 受信ポート 13 14 private UdpClient _UdpClient; // UDP 15 private IPEndPoint _IpEndPoint; // IPEndPoint 16 private Thread _RecvThread; // 受信スレッド 17 18 // 接続 19 public void Connect() 20 { 21 IPAddress grpAddr = IPAddress.Parse(_MulticastAddr); 22 23 if (_IpEndPoint != null) _IpEndPoint = null; 24 _IpEndPoint = new IPEndPoint(grpAddr, _RecvPort); 25 26 // マルチキャストグループに参加 27 Disconnect(); 28 _UdpClient = new UdpClient(_RecvPort); 29 _UdpClient.JoinMulticastGroup(grpAddr); 30 31 // 受信スレッド生成 32 _RecvThread = new Thread(ReceiveMulticastThread); 33 _RecvThread.Start(); 34 35 // ノードプロファイル通知送信 36 SendNodeProfile(); 37 } 38 39 // 切断 40 public void Disconnect() 41 { 42 if (_RecvThread != null) 43 { 44 _RecvThread.Abort(); 45 _RecvThread = null; 46 } 47 48 if (_UdpClient != null) 49 { 50 IPAddress grpAddr = IPAddress.Parse(_MulticastAddr); 51 _UdpClient.DropMulticastGroup(grpAddr); 52 _UdpClient.Close(); 53 _UdpClient = null; 54 } 55 } 56 57 // ノードプロファイル通知送信 58 public void SendNodeProfile() 59 { 60 byte[] pack = BuildNodeProfileInfo(); 61 SendPacket(pack, _MulticastAddr); 62 } 63 64 // 送信 65 public void SendPacket(byte[] packet, string host) 66 { 67 _UdpClient.Send(packet, packet.Length, host, _SendPort); 68 } 69 70 // 受信スレッド 71 public void ReceiveMulticastThread() 72 { 73 byte[] packet; 74 75 int i = 0; 76 System.Text.StringBuilder s = new System.Text.StringBuilder(); 77 78 packet = _UdpClient.Receive(ref _IpEndPoint); 79 if (packet != null) 80 { 81 // 受信できた! 82 s.Remove(0, s.Length); 83 for (i=0; i<packet.Length; i++) 84 { 85 s.Append(System.Convert.ToString(packet[i], 16).PadLeft(2, '0')); 86 } 87 Debug.Log(s.ToString()); 88 } 89 90 } 91 92 // ノードプロファイル通知パケット作成 93 private byte[] BuildNodeProfileInfo() 94 { 95 byte[] pack; 96 pack = new byte[17]; 97 98 pack[0] = 0x10; // EHD1 99 pack[1] = 0x81; // EHD2 100 pack[2] = 0x00; // 101 pack[3] = 0x01; // ID 102 103 pack[4] = 0x0E; // 送信元「ノードプロファイルクラス」 104 pack[5] = 0xF0; // EOJ = 0x0E F0 01 105 pack[6] = 0x01; // 106 107 pack[7] = 0x0E; // 送信先「ノードプロファイルクラス」 108 pack[8] = 0xF0; // EOJ = 0x0E F0 01 109 pack[9] = 0x01; // 110 111 pack[10] = 0x73; // ESV 112 113 pack[11] = 0x01; // OPC 114 115 pack[12] = 0xD5; // EPC 116 pack[13] = 0x04; // PDC 117 pack[14] = 0x01; // EDT 118 pack[15] = 0x05; // 119 pack[16] = 0xFF; // 120 pack[16] = 0x01; // 121 122 return pack; 123 } 124} 125 126コード

コード

unityでUDP通信の送信をしたい エラーはないのですが ボタンを押しても送信されません まず無反応です。何も起こりません 恐らくソースの何かがたらないです```ここに言語を入力 コード 送信コードが遅れたことも無反応なため 何か足りていないと思いました。

using UnityEngine;
using System.Net.Sockets;
using System.Text;

public class UDPClient : MonoBehaviour { public string host = "224.0.23.0"; public int port = 3610; private UdpClient client; // Use this for initialization

public void Start () {
client = new UdpClient();
client.Connect(host, port);
}

// Update is called once per frame

public void Update () {

} void OnGUI() { if (GUI.Button(new Rect(10, 10, 100, 40), "ボタン")) { byte[] dgram = Encoding.UTF8.GetBytes("hello!"); client.Send(dgram, dgram.Length); } } void OnApplicationQuit() { client.Close(); }

}

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

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

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

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

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

coco_bauer

2018/08/29 06:41

UDPの受信側のコードはどうなっているのですか? 送信できない原因は、受信側にある場合と送信側にある場合、双方にある場合がありますので、どれかを判断する必要があります。
UKAWATAKATO

2018/08/29 06:57

返信ありがとうございます受信用も載せました。送信用で送信されたということも出ていないので、送信ができていないのではないか?とおもいました。C#で作っています
YAmaGNZ

2018/08/29 07:17

マルチキャストっぽいIPアドレスでなおかつ第4オクテットに0を指定していますが、IPアドレスは合ってますか?
UKAWATAKATO

2018/08/29 08:08

返信ありがとうございます 確認しましたがあってました
guest

回答2

0

ベストアンサー

指定IPがクラスDのIPアドレスなので、マルチキャストで通信しないとだめなのではないでしょうか?

送信側

C#

1IPAddress multicastIpAddress = IPAddress.Parse("224.0.23.0"); 2client = new UdpClient(); 3client.JoinMulticastGroup(multicastIpAddress); 4IPEndPoint remoteEp = new IPEndPoint(multicastIpAddress , 3610); 5client.Send(dgram, dgram.Length, remoteEp );

受信側

C#

1IPAddress multicastIpAddress = IPAddress.Parse("224.0.23.0"); 2udp= new UdpClient(); 3udp.JoinMulticastGroup(multicastIpAddress); 4IPEndPoint remoteEp = new IPEndPoint(IPAddress.Any, 3610); 5byte[] data = udp.Receive(ref remoteEp);

といった感じで、送信側も受信側もマルチキャストグループに参加しなくてはいけないのではないかと思います。
(ソースは大体の感じで書いたので動作確認していませんし、コンパイルすら通していません)

多分、この"224.0.23.0"の他に"192.168~"というようなクラスA~CのIPアドレスがあるとは思いますので、その場合は上記のようにマルチキャストで行う必要はないかと思います。

投稿2018/08/29 08:58

YAmaGNZ

総合スコア10242

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

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

UKAWATAKATO

2018/08/30 02:07

大変丁寧なご返事ありがとうございます。 私はプログラムを始めたばかりなのですが、情報系の企業にきてしまい 課題に苦悩を毎日煩っています
UKAWATAKATO

2018/08/30 02:08

理解しやすく、UDPの仕組みを知ることができました ありがとうございます。
YAmaGNZ

2018/08/30 02:40

UDPやマルチキャストの仕組みについて学習されるべきかと思います。 マルチキャストだけがUDPの通信ではないので・・・ 上司さんのソースですが マルチキャストのデータはマルチキャストグループに所属すると受信できるようになります。 ですので、送信するためにグループに所属した場合でも、その送信データを受信できることになります。 実際に動作させてみてください。
UKAWATAKATO

2018/08/30 07:05

UDPやマルチキャストの仕組みについて学習してみます!! 丁寧に回答していただいてありがとうございました プログラムは難しいとひしひしと感じました。 一度言語の勉強を本から始めてみようと思います!!!
guest

0

UDPは送りっぱなしなプロトコルなんで、送信しただけではなにも起きません
受信側もきちんと作って、受信できるかをチェックしてみよう。

で、なにも受信できない、というなら、なにかが間違ってますんで、その間違ってるなにかを探すことになりますね

投稿2018/08/29 08:50

y_waiwai

総合スコア87749

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問