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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,128

UKAWATAKATO

score 12

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

using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Threading;

public class UdpSocket : MonoBehaviour
{
    private string _MulticastAddr = "224.0.23.0";   // マルチキャストアドレス
    private string _RemoteHost = "";                // 送信相手アドレス
    private int _SendPort = 3610;                   // 送信ポート
    private int _RecvPort = 3610;                   // 受信ポート

    private UdpClient _UdpClient;                   // UDP
    private IPEndPoint _IpEndPoint;                 // IPEndPoint
    private Thread _RecvThread;                     // 受信スレッド

    // 接続
    public void Connect()
    {
        IPAddress grpAddr = IPAddress.Parse(_MulticastAddr);

        if (_IpEndPoint != null) _IpEndPoint = null;
        _IpEndPoint = new IPEndPoint(grpAddr, _RecvPort);

        // マルチキャストグループに参加
        Disconnect();
        _UdpClient = new UdpClient(_RecvPort);
        _UdpClient.JoinMulticastGroup(grpAddr);

        // 受信スレッド生成
        _RecvThread = new Thread(ReceiveMulticastThread);
        _RecvThread.Start();

        // ノードプロファイル通知送信
        SendNodeProfile();
    }

    // 切断
    public void Disconnect()
    {
        if (_RecvThread != null)
        {
            _RecvThread.Abort();
            _RecvThread = null;
        }

        if (_UdpClient != null)
        {
            IPAddress grpAddr = IPAddress.Parse(_MulticastAddr);
            _UdpClient.DropMulticastGroup(grpAddr);
            _UdpClient.Close();
            _UdpClient = null;
        }
    }

    // ノードプロファイル通知送信
    public void SendNodeProfile()
    {
        byte[] pack = BuildNodeProfileInfo();
        SendPacket(pack, _MulticastAddr);
    }

    // 送信
    public void SendPacket(byte[] packet, string host)
    {
        _UdpClient.Send(packet, packet.Length, host, _SendPort);
    }

    // 受信スレッド
    public void ReceiveMulticastThread()
    {
        byte[] packet;

        int i = 0;
        System.Text.StringBuilder s = new System.Text.StringBuilder();

        packet = _UdpClient.Receive(ref _IpEndPoint);
        if (packet != null)
        {
            // 受信できた!
            s.Remove(0, s.Length);
            for (i=0; i<packet.Length; i++)
            {
                s.Append(System.Convert.ToString(packet[i], 16).PadLeft(2, '0'));
            }
            Debug.Log(s.ToString());
        }

    }

    // ノードプロファイル通知パケット作成
    private byte[] BuildNodeProfileInfo()
    {
        byte[] pack;
        pack = new byte[17];

        pack[0] = 0x10; // EHD1
        pack[1] = 0x81; // EHD2
        pack[2] = 0x00; // 
        pack[3] = 0x01; // ID

        pack[4] = 0x0E; // 送信元「ノードプロファイルクラス」
        pack[5] = 0xF0; // EOJ = 0x0E F0 01
        pack[6] = 0x01; //

        pack[7] = 0x0E; // 送信先「ノードプロファイルクラス」
        pack[8] = 0xF0; // EOJ = 0x0E F0 01
        pack[9] = 0x01; //

        pack[10] = 0x73;    // ESV

        pack[11] = 0x01;    // OPC

        pack[12] = 0xD5;    // EPC
        pack[13] = 0x04;    // PDC
        pack[14] = 0x01;    // EDT
        pack[15] = 0x05;    // 
        pack[16] = 0xFF;    // 
        pack[16] = 0x01;    // 

        return pack;
    }
}

コード


コード

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();
}

}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2018/08/29 15:41

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

    キャンセル

  • UKAWATAKATO

    2018/08/29 15:57

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

    キャンセル

  • YAmaGNZ

    2018/08/29 16:17

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

    キャンセル

  • UKAWATAKATO

    2018/08/29 17:08

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

    キャンセル

回答 2

checkベストアンサー

+1

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

送信側

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


受信側

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


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/30 11:07

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

    キャンセル

  • 2018/08/30 11:08

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

    キャンセル

  • 2018/08/30 11:40

    UDPやマルチキャストの仕組みについて学習されるべきかと思います。
    マルチキャストだけがUDPの通信ではないので・・・

    上司さんのソースですが
    マルチキャストのデータはマルチキャストグループに所属すると受信できるようになります。
    ですので、送信するためにグループに所属した場合でも、その送信データを受信できることになります。
    実際に動作させてみてください。

    キャンセル

  • 2018/08/30 16:05

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る