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

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

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

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

UDP

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

Q&A

解決済

1回答

1331閲覧

C言語のUDP通信について

pom_pom

総合スコア13

C

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

UDP

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

0グッド

2クリップ

投稿2017/08/02 18:23

編集2017/08/04 04:46

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));のところでエラーが出てしまいます。

よろしくお願いします。

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

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

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

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

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

hotta

2017/08/03 02:47

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

2017/08/04 03:49

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

回答1

0

ベストアンサー

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

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

C

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

C

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

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


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

C

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

C

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

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


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

C

1#define _WINSOCK_DEPRECATED_NO_WARNINGS

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

C

1error 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が出ていたので、ソースを再度修正しました。
内容は以下の通りです。

C

1#include <stdio.h> 2#include <string.h> 3#include <WinSock2.h> 4#include <Ws2tcpip.h> 5 6#define INTERVAL_TIME 1 7 8void udpSend(char* address, int port); 9int port = 20001;//ポート番号 10char addr[] = "127.0.0.1";//配列を用意 11double data[] = { 0, 1, 0.0005, -0.0009 };//送信するデータ 12 13 14int main() 15{ 16 /* Windows 独自の設定 */ 17 WSADATA data; 18 WSAStartup(MAKEWORD(2, 0), &data); 19 20 udpSend(addr, port); 21 22 /* バグは無かったですが、ここに書いたほうがいいと思います */ 23 WSACleanup(); 24 25 return 0; 26} 27 28void udpSend(char* address, int port) 29{ 30 int udp = socket(AF_INET, SOCK_DGRAM, 0); 31 struct sockaddr_in addr; 32 33 /*構造体のセット*/ 34 memset(&addr, 0, sizeof(addr)); 35 addr.sin_family = AF_INET; 36 addr.sin_port = htons(port); 37 /* inet_addr()の代わりにinet_pton()を使う(必要なら返り値を確認して、エラー処理をすること) */ 38 inet_pton(AF_INET, address, &addr.sin_addr.S_un.S_addr); 39 40 while (1) 41 { 42 sendto(udp, (char*)data, sizeof data, 0, (struct sockaddr *)&addr, sizeof(addr)); 43 Sleep(INTERVAL_TIME); 44 } 45 46 closesocket(udp); 47}

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

投稿2017/08/04 07:33

編集2017/08/04 08:53
fiveHundred

総合スコア9778

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

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

pom_pom

2017/08/07 01:50

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問