μNet3ソケットAPIのノンブロッキングモードの使用方法がよくわかりません

弊社TCP/IPプロトコルスタック「μNet3」に関するご質問
返信する
アバター
eForce技術担当
記事: 178
登録日時: 2014年4月24日(木) 14:18

μNet3ソケットAPIのノンブロッキングモードの使用方法がよくわかりません

投稿記事 by eForce技術担当 » 2019年3月27日(水) 14:45

質問:
μ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]

返信する