(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