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

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

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

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

UDP

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

Q&A

解決済

2回答

822閲覧

C言語とunityでのUDP通信について

pom_pom

総合スコア13

C

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

UDP

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

0グッド

0クリップ

投稿2017/08/09 04:06

現在、UDP通信を用いてデータを送りたいと思っています。
受信側はできているのですが、送信側がわかりません。
送りたい数値が6個あるので、string型にしてカンマで区切るということはわかりましたがサンプルコードなどが見つからず、よくわかりません。

教えていただけますか?
よろしくお願いします。

以下がコードです。

C

1//送信側 2#include <winsock2.h> 3 4int 5main() 6{ 7 WSAData wsaData; 8 9 SOCKET sock; 10 struct sockaddr_in addr; 11 12 WSAStartup(MAKEWORD(2, 0), &wsaData); 13 14 sock = socket(AF_INET, SOCK_DGRAM, 0); 15 16 addr.sin_family = AF_INET; 17 addr.sin_port = htons(5555); 18 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 19 20 double x = 0.0; 21 double y = 0.0; 22 double z = 0.0; 23 double rx = 9.0; 24 double ry = 1.0; 25 double rz = 1.0; 26 //↑これらをカンマ区切りでsにまとめる? 27 28 sendto(sock, "s", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); 29 30 closesocket(sock); 31 32 WSACleanup(); 33 34 return 0; 35} 36 37 38//受信部分 39//C# 40 41public void Receiver(string s) 42 { 43 double speedx = 0; 44 double speedy = 0; 45 double speedz = 0; 46 double rotatex = 0; 47 double rotatey = 0; 48 double rotatez = 0; 49 50 Debug.Log("Receive"); 51 try 52 { 53 //":"で区切る 54 string[] data = s.Split(':', ','); 55 //どのデータか判定する 56 57 Debug.Log(s); 58 59 if (data[0] == Header.Speed.ToString()) 60 { 61 speedx = double.Parse(data[1]); 62 speedy = double.Parse(data[2]); 63 speedz = double.Parse(data[3]); 64 rotatex = double.Parse(data[4]); 65 rotatey = double.Parse(data[5]); 66 rotatez = double.Parse(data[6]); 67 }

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

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

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

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

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

guest

回答2

0

ベストアンサー

sprintf関数を使えば、簡単にコンマ区切りの文字列を作れます。

char s[200]; // doubleを6つ + カンマを5つが十分に入る大きさの文字配列を用意する sprintf(s,"%f,%f,%f,%f,%f,%f",x,y,z,rx,ry,rz); // sprintfで書き込む

こんな感じ。

投稿2017/08/09 04:49

coco_bauer

総合スコア6915

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

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

pom_pom

2017/08/09 22:32

わかりやすい回答ありがとうございました!
guest

0

sprintf()という関数があるので、これを使えばよいでしょう。
使い方は、文字列を指定すること以外は、ほぼprintf()と同じです。

(追記:)
と言いましたが、VisualStudioだとエラーが出ますね…
代わりにsprintf_s()を使ってください。
(追記ここまで)

ちなみに、文字列以外も送信することが出来ます。
以下のURLでは、double型の配列を送受信しています。
http://qiita.com/nenjiru/items/b1ffd4a01b3d96b2bbb7


というか、inet_addr()でエラーは出ませんでしたか?
前の質問のときでは、inet_addr()を使うとエラーが出たので、inet_pton()を使ったのですが…

投稿2017/08/09 04:34

編集2017/08/09 04:50
fiveHundred

総合スコア9796

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

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

pom_pom

2017/08/09 22:31

ありがとうございます。 はい、なぜだかわかりませんが今回は出ませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問