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

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

ただいまの
回答率

88.63%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 868

gucci12321

score 49

前提

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

 【実現したいこと】

♦目的
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サーバーへのデータ送信

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • keicha_hrs

    2018/12/05 10:57

    Yahoo知恵袋にも質問を投稿されているようなのですが、teratailではマルチポストを推奨していません。利用ガイド(https://teratail.com/help#posted-otherservice)を参照してください。

    キャンセル

  • gucci12321

    2018/12/05 11:12 編集

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

    キャンセル

回答 2

checkベストアンサー

+1

Wiznet/Loopback_FRDM-KL25Z_Eclipse
Wiznet/Loopback_LPC11E36_LPCXpresso

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

それによると

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/05 10:59

    ご回答ありがとうございます!

    そちらを試してみます!

    キャンセル

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

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

関連した質問

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

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