質問:
μNet3ソケットAPIでノンブロッキングモードを使用する方法がよくわかりません。
回答:
ここではノンブロッキングモード動作の概要と注意点などについて説明します。
各API使用方法の詳細はμNet3ユーザーズガイドを参照して下さい。
●ノンブロッキングモード動作の流れ
ノンブロッキングモードを使用するには、ソケットのパラメータ設定用API(cfg_soc)を使用してあらかじめソケットに対してコールバック関数を登録し、ノンブロッキングモードに設定する対象のソケットAPI(con_soc/cls_soc/snd_soc/rcv_soc)を指定します。
ブロッキングモードとノンブロッキングモードの混在(con_soc/cls_socはブロッキングモード、snd_soc/rcv_socはノンブロッキングモードとするなど)も可能です。
ノンブロッキングモードに設定した状態で各ソケットAPIを呼び出した場合、APIの戻り値がE_WBLKである場合(ノンブロッキングモードで処理したことを示す)に限り、コールバックされます。
E_WBLK以外のエラーコード返却時や待ち要因がなく正常終了した場合はコールバックされません。
●ノンブロッキングモード動作となる待ち要因
ノンブロッキングモードに設定した上で、各API呼出し時に待ち要因がある場合にノンブロッキングモードで処理され、E_WBLKが返されます。
各APIでE_WBLKが返される主な待ち要因は下記の通りです。
1)TCPソケット
・con_soc(ソケットの接続)
con_flg=SOC_CLIの場合(クライアント):サーバからのSYN/ACK待ち
con_flg=SOC_SERの場合(サーバー):クライアントからのSYN待ち
・cls_soc(ソケットの切断)
cls_flg=SOC_TCP_CLSの場合(接続を終了):FINに対するACKおよび対向からのFIN待ち
cls_flg=SOC_TCP_SHTの場合(送信のみ無効):待ち要因なし
・rcv_soc(データの受信)
データ受信待ち
・snd_soc(データの送信)
送信バッファの空き待ち
2)UDPソケット
・con_soc(ソケットの接続)
待ち要因なし
・cls_soc(ソケットの切断)
待ち要因なし
・rcv_soc(データの受信)
データ受信待ち
・snd_soc(データの送信)
アドレス解決、ドライバの送信完了待ち
●ノンブロッキングモード使用時の注意点
1) ノンブロッキングモードに設定した場合でも、必ずコールバック関数が呼び出されるのではなく、各ソケットAPIの戻り値がE_WBLKの場合のみコールバック関数が呼び出されます。
従って通常は各ソケットAPI呼び出し時に戻り値に応じた制御が必要になります。
2) コールバック関数はTCP/IPまたはドライバのコンテキストで実行されますので、コールバック関数からソケットAPIの呼び出しや待ち状態に入る制御は行わないでください。
3) コールバック待ち中の多重呼び出しは受付できません。ソケットAPI呼び出し後、コールバック前に同一ソケットに対して同一APIを呼び出すと戻り値にE_QOVRが返ります。
検索用
[ソケット][TCP][UDP][con_soc][cls_soc][snd_soc][rcv_soc][ノンブロッキング][コールバック][E_QOVR][E_WBLK]