ノンブロッキングでrcv_socで受信サイズが0の場合

弊社TCP/IPプロトコルスタック「μNet3」に関する書込みはこちらにお願いします。
返信する
sato
記事: 2
登録日時: 2017年11月19日(日) 14:16

ノンブロッキングでrcv_socで受信サイズが0の場合

投稿記事 by sato » 2017年11月19日(日) 14:22

行いたいことはデータを受信した場合にcallback関数が呼ばれることです。
しかし、データを受信してもcallback関数が呼び出されません。
データを受信した場合にcallback関数が呼び出されるようにするにはどのようにすればよいでしょうか

受信をノンブロッキングで設定しております。
そして、送信した後にcallbackをあげるため空読みしています。
しかしcallbackが実行されません。
すでに受信していた場合にcallbackはあがらないのでしょうか。

以下のコードような想定で、送信の後にrcv_socを受信データサイズ0で指定しています。
rcv_soc関数の戻り値が0(切断)となってしまいます。
しかし、すぐあとにrcv_soc関数で受信データを0より大きい値にすると受信できます。
rcv_soc関数の受信データサイズを0にした場合には、0バイトを受信できたことを返す仕様でしょうか。

宜しくお願い致します。

===定義===
cfg_soc(SockId, SOC_CBK_HND, (VP)SockCallback);
cfg_soc(SockId, SOC_CBK_FLG, (VP)(EV_SOC_CON|EV_SOC_RCV|EV_SOC_CLS));
==========

===送信関数===
snd_soc(SockId, (char *)Buff, lSendSize);

char dummy[10];
rcvercd = rcv_soc(SockId, (VP)&dummy, 0);
==============

===SockCallback===
ER SockCallback(SID sid, UH event, ER ercd)
{
・・・省略・・・
if(event & EV_SOC_RCV)
{
iset_flg(ID_SOC_FLG, TCP_EVENT);
}
}
=================

===受信関数===
FLGPTN waiptn = TCP_EVENT;
twai_flg(ID_SOC_FLG, waiptn, TWF_ORW, &flgptn, TMO_FEVR);
rcv_soc(SockId, (VP)&rcvdata, 100);
=============
最後に編集したユーザー sato [ 2017年11月19日(日) 17:02 ], 累計 2 回

アバター
eForce技術担当
記事: 179
登録日時: 2014年4月24日(木) 14:18

Re: ノンブロッキングでrcv_socで受信サイズが0の場合

投稿記事 by eForce技術担当 » 2017年11月21日(火) 14:28

>すでに受信していた場合にcallbackはあがらないのでしょうか。

すでにパケットを受信している状態で、ノンブロッキングの設定を行った場合
コールバックされることはありません。またパケット未受信時に、ノンブロッキング
設定を実施しても、rcv_soc()を発行していなければコールバックされることはありません。

受信に限らず、ノンブロッキング設定されたAPIがコールバックされる前提条件は
予め実行したAPIがE_WBLKを返却した場合のみです。つまりこのAPIが完了した
時点(正常終了もしくはエラー)で、その後コールバックが呼ばれることはありません。


>以下のコードような想定で、送信の後にrcv_socを受信データサイズ0で指定しています。
>rcv_soc関数の戻り値が0(切断)となってしまいます。
>しかし、すぐあとにrcv_soc関数で受信データを0より大きい値にすると受信できます。
>rcv_soc関数の受信データサイズを0にした場合には、0バイトを受信できたことを返す仕様でしょうか。

はい、TCPソケットのrcv_soc()のバッファサイズに0を指定した場合は0が返却される仕様です。
従いましてこの場合も、後にコールバックが呼ばれることはありません。

返信する