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

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

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

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

UDP

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

Q&A

解決済

2回答

2642閲覧

UDP通信をC言語で実現したいが、server側のメイン関数をうまく書けない! *前回の質問の続き

gucci12321

総合スコア49

C

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

UDP

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

0グッド

0クリップ

投稿2018/12/04 12:11

編集2018/12/04 12:15

######前提
*初めてこのようなプログラムを作るので、的外れなことを言っているかもしれません。
そのため、些細なことでもすべて指摘していただけると非常に助かります。
今回と直接的な関係はないですが、前回質問したときと同様のプログラムを使用しています。

【実現したいこと】

♦目的
UDP通信を実現したい

♦サンプルプログラムをもとに作成したプログラムプログラムのZIPファイルへのリンク
main.c(下に記載)
loopback.c(一部を下に記載)
loopback.h
socket.c
socket.h
w5200.c
w5200.h
wizchip_conf.c
wizchip_conf.h
*他の部分はコードが長く、記載できないため、以下のZIPファイルにまとめました。
プログラムのZIPファイルへのリンク

♦詳細
①Server側
サンプルプログラム内のloopback_udpを使って通信したい
・使用機器
EthernetIF:WIZnet W5200 for QuickStart (#40002)リンク
プロセッサ側:Propeller QuickStart (#40000)リンク
これをPCとつないでSimpleIDEという統合開発環境を使用している。

②Client側*まだ未完
Serverからデータを1~10Mbyte分受信し、ファイルに保存する。
*正直まだどのようにすればよいかわからない。

#質問内容
まず、Server側のプログラムを完成させたいと考えてます。
そこで、メイン関数を作成したいのですが、
・loopback_udp()の使い方
・IPアドレスの設定方法
・受信の仕方

という部分が分からない状態です。。。

###Build時に出てくるメッセージ
以下のようにエラーは発生していないのですが、SimpleIDEのターミナルには、main関数で自分が書いた”Server program start!!!”
しか表示されていない状態です。

SimpleIDE Version 1.1.2 propeller-elf-gcc.exe -v GCC 4.6.1 (propellergcc_v1_0_0_2408) propeller-elf-gcc.exe -I . -L . -Os -mcmm -m32bit-doubles -fno-exceptions -std=c99 -c loopback.c -o cmm/loopback.o propeller-elf-gcc.exe -I . -L . -Os -mcmm -m32bit-doubles -fno-exceptions -std=c99 -c socket.c -o cmm/socket.o propeller-elf-gcc.exe -I . -L . -Os -mcmm -m32bit-doubles -fno-exceptions -std=c99 -c w5200.c -o cmm/w5200.o propeller-elf-gcc.exe -I . -L . -Os -mcmm -m32bit-doubles -fno-exceptions -std=c99 -c wizchip_conf.c -o cmm/wizchip_conf.o propeller-elf-gcc.exe -I . -L . -o cmm/main.elf -Os -mcmm -m32bit-doubles -fno-exceptions -std=c99 cmm/loopback.o cmm/socket.o cmm/w5200.o cmm/wizchip_conf.o main.c -lm main.c: In function 'main': main.c:12:3: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration] main.c:12:3: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default] main.c:18:16: warning: initialization makes pointer from integer without a cast [enabled by default] main.c:21:3: warning: passing argument 1 of 'loopback_udps' makes integer from pointer without a cast [enabled by default] loopback.h:32:9: note: expected 'uint8_t' but argument is of type 'uint8_t *' main.c:21:3: warning: passing argument 2 of 'loopback_udps' makes pointer from integer without a cast [enabled by default] loopback.h:32:9: note: expected 'uint8_t *' but argument is of type 'uint8_t' propeller-load -s cmm/main.elf propeller-elf-objdump -h cmm/main.elf Done. Build Succeeded!

該当のソースコード

main.c

#include "loopback.h" #include "w5200.h" #include "socket.h" #include "wizchip_conf.h" int main() { printf("Server program start!!!\n"); uint8_t sn[4]={0,0,0,0}; uint8_t* buf=1024; uint16_t port=3000; loopback_udps(sn, *buf, port); return 0; }

loopback.cのファイルの中のloopback_udps()

int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port) { int32_t ret; uint16_t size, sentsize; uint8_t destip[4]; uint16_t destport; switch(getSn_SR(sn)) { case SOCK_UDP : if((size = getSn_RX_RSR(sn)) > 0) { if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport); if(ret <= 0) { #ifdef _LOOPBACK_DEBUG_ printf("%d: recvfrom error. %ld\r\n",sn,ret); #endif return ret; } size = (uint16_t) ret; sentsize = 0; while(sentsize != size) { ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport); if(ret < 0) { #ifdef _LOOPBACK_DEBUG_ printf("%d: sendto error. %ld\r\n",sn,ret); #endif return ret; } sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero. } } break; case SOCK_CLOSED: #ifdef _LOOPBACK_DEBUG_ //printf("%d:UDP loopback start\r\n",sn); #endif if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn) return ret; #ifdef _LOOPBACK_DEBUG_ printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, port); #endif break; default : break; } return 1; }

試したこと

ネットワークウォッチャーを用いて、Server側のIPアドレスを見ると、192.168.1.104であった。
そのため、terminalを用いて、
IP:192.168.1.104
PORT:3000
にアクセスしてみたが、何も表示されなかった。

ちなみに、IPアドレスが、なぜこのようになっているのかわからない。

補足情報(使用機器、参考URL)

♦使用機器
WIZnet W5200 for QuickStart (#40002)
Propeller QuickStart (#40000)

♦IDE
simpleIDE

また、以下に参考にしたサイトを挙げておきます。
♦プログラムを作成するうえで参考にしたサイト*今回使用しているのはW5200
W5500 UDP機能
WIZnet ioLibrary
W5500 UDPサーバーへのデータ送信

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

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

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

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

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

gucci12321

2018/12/05 02:13 編集

ご連絡ありがとうございます。全く知りませんでした。知恵袋の方を削除しようと思いましてができませんでした。今後気をつけます。ご指摘ありがとうございました。
guest

回答2

0

ベストアンサー

Wiznet/Loopback_FRDM-KL25Z_Eclipse
Wiznet/Loopback_LPC11E36_LPCXpresso

loopbackを用いた場合のサンプルが別IDEですがありました

それによると

c

1int main(int argc, char* argv[]){ 2 // 初期化 3 // よくしらんので省略 4 while(1){ 5 loopback_udps(SOCK_UDPS, gDATABUF, PORT_UDPS); 6 } 7}

となります。
初期化部分については私は詳しくないので
ご自分でやってみてください

chmに書かれてるTODOを読むと
reg_wizchip_cs_cbfuncおよびreg_wizchip_spi_cbfuncでコールバックを設定するのも必要らしいです

投稿2018/12/05 02:29

asm

総合スコア15147

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

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

0

ぱっと見なのですが、「受信データが到達するまで待つ」という処理が存在しないように思えます。ですから、実行しても受信データがないために即座にloopback_udps()関数を抜けて終了、となっているのではないですか。対向機器からのデータを受信するまで待たせたいのならば、「受信データがなければループする」という記述が必要になるのではないでしょうか。

投稿2018/12/05 01:54

編集2018/12/05 01:58
keicha_hrs

総合スコア6768

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

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

gucci12321

2018/12/05 01:59

ご回答ありがとうございます! そちらを試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問