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

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

ただいまの
回答率

90.37%

  • C

    4832questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • UDP

    78questions

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

C言語のUDP通信について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,255

pom_pom

score 9

UDP通信について

今、C言語を用いて計算させた複数の値をUnityのオブジェクトへ渡してオブジェクトを移動させようとしています。
キャラクターの位置x,yと速度vをC言語で計算し、UDP通信を用いてUnityのオブジェクトへ渡して移動を反映させようと思っています。

参考にしているコードはこちらです。http://qiita.com/nenjiru/items/b1ffd4a01b3d96b2bbb7

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <WinSock2.h>

#define INTERVAL_TIME 1

void udpSend(char* address, int port);
int port = 20001;//ポート番号
char addr[] = "0.0.0.0";//配列を用意
double data[] = { 0, 1, 0.0005, -0.0009 };//送信するデータ


int main()
{
    /* Windows 独自の設定 */
    WSADATA data;
    WSAStartup(MAKEWORD(2, 0), &data);

    udpSend(addr, port);
    return 0;
}

void udpSend(char* address, int port)
{
    int udp = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in addr;
    struct hostent *host;

    /*構造体のセット*/
    memset(&addr, 0, sizeof(addr));
    host = gethostbyname(address);
    memcpy(host->h_addr, &addr.sin_addr, host->h_length);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);

    while (1)
    {
        sendto(udp, (unsigned char*)data, sizeof data, 0, (struct sockaddr *)&addr, sizeof(addr));
        Sleep(INTERVAL_TIME);
    }

    closesocket(udp);
    WSACleanup();
}


私はVisual Studioを使用しているため、サイトのコードを少し変更しました。
sendto(udp, (unsigned char*)data, sizeof data, 0, (struct sockaddr *)&addr, sizeof(addr));のところでエラーが出てしまいます。

よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • hotta

    2017/08/03 11:47

    コード全体を範囲指定して <code> をクリックしてください。

    キャンセル

  • tmp

    2017/08/04 12:49

    送信先に0.0.0.0ってできなかった気がしますが、127.0.0.1とかで試してみてください

    キャンセル

回答 1

checkベストアンサー

0

error C2664: 'int sendto(SOCKET,const char *,int,int,const sockaddr *,int)': 引数 2 を 'unsigned char *' から 'const char *' へ変換できません。


とエラーが出ているので、

        sendto(udp, (unsigned char*)data, sizeof data, 0, (struct sockaddr *)&addr, sizeof(addr));


        sendto(udp, (char*)data, sizeof data, 0, (struct sockaddr *)&addr, sizeof(addr));


とすれば直ります。
(エラーが出ているのであれば、質問時にその内容をコピペで貼り付けておくとベターです)


以下の内容、不適切でした。読み飛ばしてください
あと、私の環境が悪いのかもしれませんが、

    /*構造体のセット*/
    memset(&addr, 0, sizeof(addr));
    host = gethostbyname(address);
    memcpy(host->h_addr, &addr.sin_addr, host->h_length);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);


    /*構造体のセット*/
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.S_un.S_addr = inet_addr(address);


としないと何故かうまく動作しませんでした。
(もし、あなたの環境で問題なく動いていれば、これは修正する必要はありません)
ここまで


上記のうまく動作しなかった件ですが、元のソースの

#define _WINSOCK_DEPRECATED_NO_WARNINGS


この部分を削除したところ、

error C4996: 'gethostbyname': Use getaddrinfo() or GetAddrInfoW() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings


と出ていました。
なので、gethostbyname()は使ってはいけなかったみたいです。
このような、errorやwarningを消すようなことは基本的にしないでください。
(といっても、投稿前に気づかなかった私も結構ドジですが…)
errorはもちろん、warningも意図していない限りは修正すべきです。

それで、_WINSOCK_DEPRECATED_NO_WARNINGSを削除して再度実行していたところ、私の修正でも同じようなerrorが出ていたので、ソースを再度修正しました。
内容は以下の通りです。

#include <stdio.h>
#include <string.h>
#include <WinSock2.h>
#include <Ws2tcpip.h>

#define INTERVAL_TIME 1

void udpSend(char* address, int port);
int port = 20001;//ポート番号
char addr[] = "127.0.0.1";//配列を用意
double data[] = { 0, 1, 0.0005, -0.0009 };//送信するデータ


int main()
{
    /* Windows 独自の設定 */
    WSADATA data;
    WSAStartup(MAKEWORD(2, 0), &data);

    udpSend(addr, port);

    /* バグは無かったですが、ここに書いたほうがいいと思います */
    WSACleanup();

    return 0;
}

void udpSend(char* address, int port)
{
    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_addr()の代わりにinet_pton()を使う(必要なら返り値を確認して、エラー処理をすること) */
    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);
    }

    closesocket(udp);
}

以上です。いろいろと失礼しました。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/07 10:50

    回答ありがとうございます。
    無事、動かすことができました。
    詳しく説明していただき、初心者の私でもとてもわかりやすかったです!
    また、投稿するときの注意などもためになりました。ありがとうございました。
    プログラムを作るのが楽しくなってきたので、もっとスラスラ書けるように勉強しようと思います!(^^)

    本当にありがとうございました。

    キャンセル

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

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

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

  • C

    4832questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • UDP

    78questions

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