(toppers-users 2375) Re: 連続データストリームの受信について
ykominami
ykominami @ nifty.com
2006年 4月 1日 (土) 14:09:58 JST
小南です。
On Sat, 1 Apr 2006 12:24:33 +0900
Noda <dearliz @ jnb.odn.ne.jp> wrote:
> 小南様
>
> Nodaです。
> レスありがとうございます。
> 文面が解りにくくて申し訳ありません。以下、本文引用させていただき
> 回答いたします。
>
>
> > 連続ストリームの受信というのが、具体的にどういう処理を意図され
> > ているのかが
> > 分かりません。
>
> MP3データストリームの受信です。
> インターネットラジオのようなものだと思っていただければ良いと思い
> ます。
>
> > Nodaさんの文面から、システムから意図した動作を示さない、あるい
> > はシステム
> > からの反応が得られないという状態なのかなと推測したのですが、そ
> > うなのでしょう
> > か。
>
> 以下のようなタスクを作って動作させると、wai_sem()を何度か
> (2〜3回だったり、5〜6回だったり不定です)
> 呼んだ後に停止してしまいます。いわゆる「printfデバッグ」を
> 行なっているので、はっきりしたことは解らないのですが、
> たぶんtcp_rcv_dat()から戻ってこないのでは?と思われます。
>
> (タスクとは別に1秒間隔の周期ハンドラを動作させているのですが、
> それは動いています。)
>
>
> void task1( VP_INT exinf )
> {
> #define BUFF_SIZE 8192
> UB buffer[BUFF_SIZE];
> UW buf_size = BUFF_SIZE;
>
> for ( ;; )
> {
> ercd = tcp_rcv_dat( cepid, (VP)buffer, buf_size, TMO_NBLK );
>
> if ( ercd != E_WBLK || ercd == 0 )
> {
> break;
> }
>
> syscall(wai_sem(SEM_STREAM));
> }
> }
ITRON TCP/IP API仕様 Ver. 1.00.01によると、、tcp_rcv_dat()に
正常終了の場合は正の値(取り出したデータの長さ)が、データ終結(接続が
正常切断された)では0が返ってきます。
> if ( ercd != E_WBLK || ercd == 0 )
この条件文では、ノンブロッキングコール受付でない場合は、正常終了の場合
でも、他のエラーの場合でも、必ずbreakしてしまいます。
そしてそのままtask1()を終了してしまいます。
たまたまノンブロッキングコール受付になったときのみループが回るように
見えるます。
これはNodaさんが意図された動作とは違うのではないでしょうか?
-----------------------------------
小南 ykominami @ nifty.com