<hipc/usoc.h>
Universal socket (USoc)とは、マイコン毎に異なる通信用APIをHIPCから統一的に扱うための仕組みである。 具体的には入出力関数hipcUsocRead()
とhipcUsocWrite()
の仕様について定めている。
Usocの関数仕様は簡略化されており、全ての処理が完了するか、そうでなければエラーを返す。 例えば、指示された16バイトのうち12バイトのみ処理されて残り4バイトは未処理という状況では、引き続き処理を続けて16バイト全てを処理して返るか、全バイトの処理を諦めて通信エラーを戻り値にして返るかのどちらかである。
enum HIPC_errno hipcUsocRead(hipc_usoc * so_p, void *buf, const size_t size)
size
が0のときは何もしない。size
が0でないとき、buf
からsize
バイト全ての読み込みを試みる。size
バイト全てを読み込めたなら、HIPC_SUCCESSを返す。そうでければ、エラーを返す。
enum HIPC_errno hipcUsocWrite(const int fd, const void *buf, const size_t count)
size
が0のときは何もしない。size
が0でないとき、buf
からsize
バイト全ての書き込みを試みる。size
バイト全てを書き込めたなら、HIPC_SUCCESSを返す。そうでければ、エラーを返す。
<hipc/usocutils.h>
ユニバーサルソケットso_p
へHIPCメッセージmd_p
を書き込む。
enum HIPC_errno hipcUsocWriteMsgd(struct HIPC_usoc * const so_p,
hipc_msgd const *const md_p)
ユニバーサルソケットso_p
で、構成cfg_p
のセッションを待ち受ける。 正常にセッションが受け付けられるとHIPC_SUCCESSが返される。 cfg_p
とは異なる構成のセッション開始が要求されるなどの問題が発生した場合は、 内容に応じたエラーが返される。
enum HIPC_errno hipcUsocAcceptSimple(struct HIPC_usoc * const so_p,
const struct HIPC_scfg *const cfg_p)
ユニバーサルソケットso_p
で、セッションを待ち受ける。 長さn_cfg
の構成の配列cfg_ary
の中のどれか1つの構成が受け付けられると、 cfg_pp
に受け付けた構成がセットされてHIPC_SUCCESSが返される。 受け付けに失敗した場合はエラーが返される。 この関数はHELLOメッセージ全体を一時的にバッファにに読み込むので、 cfg_ary
の全ての構成のHELLOメッセージよりも大きいバッファを用意し、 buf
にその先頭アドレスを、buf_size
にそのサイズを指定する。
enum HIPC_errno hipcUsocAccept(struct HIPC_usoc * const so_p,
const struct HIPC_scfg * *const cfg_pp,
const struct HIPC_scfg *const *const cfg_ary,
const unsigned int n_cfg,
unsigned char *const buf, size_t buf_size)
<hipc/msgd.h>
メッセージデータmdR
のヘッダの読み込み先はhipcMsgdHdrPtr(&mdR)
でを得ることが出来る。 また、ヘッダ長は常にHIPC_MSGHDR_SIZE
である。 よって、クライアントから送られてきたHIPCメッセージのヘッダを hipcUsocRead
でso_p
からmdR
へ読み込むコードは以下の通りとなる。
hipcUsocRead(so_p, hipcMsgdHdrPtr(&mdR), HIPC_MSGHDR_SIZE);
ヘッダを読み込んだメッセージデータから、メッセージの基本情報を得るには以下の関数を使う。 それぞれ、タイプ、構造体型番号、オフセット、レンジサイズを返す。
これらの関数はsizeof
及びoffsetof
演算子と共に利用することで、メンバ毎などの細かなアクセス制御に利用できる。
unsigned char hipcMsgdType(hipc_msgd const *const md_p)
unsigned char hipcMsgdStruno(hipc_msgd const *const md_p)
unsigned char hipcMsgdOffset(hipc_msgd const *const md_p)
unsigned char hipcMsgdRngsize(hipc_msgd const *const md_p)
enum HIPC_errno hipcMsgdSetBdyForPut(hipc_msgd * const mdr_p,
void *const stru_p,
const size_t stru_size)
hipcMsgdSetBdyForPut()
はメッセージデータにPUTメッセージのボディ読み込み開始位置をセットする関数であり、 この位置はhipcMsgdBdyPtr()
で得ることが出来る。 また、hipcMsgdBdySize()
はボディのサイズを返す。 よって、mdR
に既にPUTメッセージのヘッダが読み込まれているときに、 そのヘッダ情報を基に変数prm
へメッセージボディの値を書き込むコードは以下のようになる。
hipcMsgdSetBdyForPut(&mdR, &prm, sizeof(prm));
hipcUsocRead(so_p, hipcMsgdBdyPtr(&mdR), hipcMsgdBdySize(&mdR));
ここで、mdR
のメッセージヘッダの構造体型番号と変数prm
の型は対応が取れている必要がある。 通常の使い方なら、メッセージヘッダの構造体型番号がstruct foo
型に振られているなら、prm
はstruct foo
型の変数である。
hipcMsgdSetBdyForPut()
の第3引数sizeof(prm)
は続くhipcUsocRead()
で発生するprm
への書き込みがprm
のメモリ範囲に収まっていることを確認するためにある。 与えられた変数のメモリ範囲を超えた書き込みになる場合には、hipcMsgdSetBdyForPut()
はエラーを返すので、戻り値は必ずチェックすべきである。
enum HIPC_errno hipcGenmdSuccess(hipc_msgd * const md_p)
md_p
が指し示すメッセージデータを、データ無しのSUCCESSメッセージにする。 このメッセージはPUTメッセージに対する成功の返答に利用できる。
enum HIPC_errno hipcGenmdSuccessToGet(hipc_msgd * const mds_p,
hipc_msgd const *const mdr_p,
void *const stru_p,
const size_t stru_size)
hipcGenmdSuccessToGet()
はGETメッセージへの返答となるデータ付きのSUCCESSメッセージを作成するする関数である。 mdR
が変数prm
へのGETメッセージだったとして、これを基に返答メッセージmdS
を作成するコードは以下のようになる。
hipcGenmdSuccessToGet(&mdS, &mdR, &prm, sizeof(prm));
通常の使い方なら、prm
の型はGETメッセージmdR
が含む構造体型番号が振られている構造体型のはずである。
また、この関数は第3引数のsizeof(prm)
を使って、実際にmdS
をソケットに書き込む際にprm
の範囲を超えたメモリアクセスが起きないかチェックし、起きる場合にはエラーを返す。 不適切なメモリアクセスは、プログラムの暴走や情報の漏洩につながる可能性があるので、戻り値は必ずチェックすべきである。
enum HIPC_errno hipcGenmdQuit(hipc_msgd * const md_p,
const enum HIPC_errno hipc_errno,
char *const errdtlstr)
md_p
が指し示すメッセージデータを、hipc_errno
のエラー番号とerrdtlstr
のエラー詳細文字列を持つQUITメッセージにする。
Last modified: 2015/07/27 08:00:59 +09:00