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

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

ただいまの
回答率

88.64%

Datagramsocketを使ったUDP通信について

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,237

kkaaaiiii

score 15

 前提・実現したいこと

前回の質問の続きです。通信初心者です。
今、自分はHoloLensを使った開発をunityでやっています。
HoloLensとpcで通信をするのにUDP通信を使っていたのですが、unityからUWPにビルドする際エラーが起きました。
調べたところによると、どうやらunityではUdpCliantというものが使えたのですが、これはUWPに対応してないみたいです。
対策としてunity側の受信とUWP側の受信を分けて処理するとのことでした。
そしてUWP側ではDatagramSocketというものを使うみたいです。

やりたいこととしてはc言語のプログラムで計算したdouble型の値をHoloLensに送り、
それを使ってオブジェクトの座標を変更させたいです。

参考にしたサイト1
参考にしたサイト2

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

動かしたいオブジェクトが動きません。
いろんなサイトを参考にしながら見よう見まねでとりあえずコードを書いてみましたが、
うまく受信ができていないようです。前回と送信側はほとんど変更していません。

 該当のソースコード

//送信側
void send_point(double u, char* address, int port) {
    double data[] = { u };
    WSADATA dat;
    WSAStartup(MAKEWORD(2, 0), &dat);
    int udp = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in addr;

    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);

    inet_pton(AF_INET, address, &addr.sin_addr.S_un.S_addr);
    /*
    while (1)
    {
    sendto(udp, (char*)data, sizeof data, 0, (struct sockaddr *)&addr, sizeof(addr));
    Sleep(INTERVAL_TIME);
    }
    */
    sendto(udp, (char*)data, sizeof data, 0, (struct sockaddr *)&addr, sizeof(addr));

    closesocket(udp);

    WSACleanup();
}
//受信側
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Threading;
using UnityEngine.Assertions;
using System.Text;

#if UNITY_EDITOR
using System.Net;
using System.Net.Sockets;
#else
using System.IO;
using Windows.Networking.Sockets;
#endif

public class LineController : MonoBehaviour
{
    private const int DATA_LENGTH = 1;
    private const int DOUBLE_LENGTH = 8;
    private Thread thread;
    private byte[] data;
    private double[] result = new double[DATA_LENGTH];
    public  float width;
    private int listenport = 20001;

    void getPoint()
    {
        Vector3 pos = gameObject.transform.localPosition;
        //Vector3 pos2 = parent.transform.position;
        gameObject.transform.localPosition = new Vector3((float)result[0] / 640f * width, pos.y, pos.z);//ここの比を変える
    }
#if UNITY_EDITOR

    private UdpClient udp;
    void Start()
    {
        udp = new UdpClient(listenport);
        thread = new Thread(new ThreadStart(threadWork));
        thread.Start();
    }

    void Update()
    {
        if (data != null)
        {
           //Debug.LogFormat("{0}", result[0]);
            getPoint();
        }
    }

    void OnApplicationQuit()
    {
        udp.Close();
        thread.Abort();
    }

    void threadWork()
    {
        while (true)
        {
            IPEndPoint remoteEP = null;
            data = udp.Receive(ref remoteEP);

            for (int i = 0; i < DATA_LENGTH; i++)
            {
                result[i] = BitConverter.ToDouble(data, i * DOUBLE_LENGTH);
            }

        }

    }

#else
    DatagramSocket socket;
    object lockObject = new object();
    const int MAX_BUFFER_SIZE = 1024;
    async void Start()
    {
        socket = new DatagramSocket();
        socket.MessageReceived += getPoint;
        await socket.BindServiceNameAsync(listenport.ToString());
    }
    async void getPoint(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
    {
        using (var stream = args.GetDataStream().AsStreamForRead()) {
            byte[] buffer = new byte[MAX_BUFFER_SIZE];
            await stream.ReadAsync(buffer, 0, MAX_BUFFER_SIZE);
            string s = Encoding.ASCII.GetString(buffer);
            result[0] = Convert.ToDouble(s);
            getPoint();
        }
    }
#endif
}

ご意見、ご指摘お願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

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

関連した質問

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