Socket 通信

Topへ

概要:ETIでSocket通信を行なうためのビルトインルール群です。これらのルールにはプレフィックスとしてic::がつきます。これらのルールを有効にするためにはic.dllをロードする必要があります。

述語名/引数  (ic:connect *ip *port *ic)
要約 サーバとの同期的接続を確立します。
互換性 Win
引数 *ip [in] IPアドレスを表す文字列
*port [in] ポート番号を表す整数
*ic [out] 接続を表す識別子
成功/失敗 true  接続の確立に成功しかつ*icのマッチングに成功
false 上記以外
解説 同期通信のためのサーバとの接続を確立します。接続を終了するにはic::disconnectを、また、Socket通信自体を終了する場合はic::disconnectをコールした後ic::cleanupをコールします。

 


述語名/引数  (ic:asyncConnect *ip *port *ic)
 (ic:asyncConnect *ip *port *ic *socket)
要約 サーバとの非同期的接続を確立します。
互換性 Win
引数 *ip [in] IPアドレスを表す文字列
*port [in] ポート番号を表す整数
*ic [out] 接続を表す識別子
*socket [out] ソケット識別子
成功/失敗 true  接続の確立に成功しかつ*icと*socketのマッチングに成功
false 上記以外
解説 同期通信のためのサーバとの接続を確立します。接続を終了するにはic::asyncDisconnectを、また、Socket通信自体を終了する場合はic::disconnectをコールした後ic::cleanupをコールします。

サーバとの通信はic::getMessageまたはic::peekMessageを用いて行ないます。

 


述語名/引数  (ic:initializeServer *port *ic)
要約 サーバとしてクライアントとの接続の準備を行ないます。
互換性 Win
引数 *port [in] ポート番号を表す整数
*ic [out] 接続を表す識別子
成功/失敗 true  初期化に成功しかつ*icのマッチングに成功
false 上記以外
解説 同期通信のためのサーバとの接続を確立します。サーバの機能を終了させるにはic::cleanupをコールします。

クライアントとの通信はic::getMessageまたはic::peekMessageを用いて行ないます。

 


述語名/引数 (ic:sendString *ic *text *len)
(ic:sendString *ic *socket *text *len)
要約 文字列を送信します。
互換性 Win
引数 *ic [in} 接続を表す識別子
*socket [in] ソケット識別子
*text [in] 送信する文字列
*len [out] 送信したデータのバイト数(文字列とその終端記号のバイト数の合計)
成功/失敗 true  文字列の送信に成功しかつ*lenのマッチングに成功
false 上記以外
解説  

 


述語名/引数 (ic:receiveString *ic *text *len)
要約 文字列を受信します。
互換性 Win
引数 *ic [in} 接続を表す識別子
*text [out] 受信する文字列
*len [out] 受信したデータのバイト数(文字列とその終端記号のバイト数の合計)
成功/失敗 true  文字列の受信に成功しかつ*textと*lenのマッチングに成功
false 上記以外
解説 このルールはと同期的に文字列を受信します。

 


述語名/引数 (ic:getText *ic *text)
(ic:getText *ic *socket *text)
要約 文字列を非同期的に受信します。
互換性 Win
引数 *ic [in} 接続を表す識別子
*socket [in] ソケット識別子
*text [out] 受信する文字列
成功/失敗 true  文字列の受信に成功しかつ*textのマッチングに成功
false 上記以外
解説 前者の形式は、asyncConnectで生成された接続に対して用います。
後者の形式は、initializeServerで生成された接続に対して用います。*socketを用いて送信元のクライアントを識別します。

 


述語名/引数 (ic:getMessage *m)
要約 サーバから受信したメッセージをメッセージキューから取り出します。
互換性 Win
引数 *m [in} 接続を表す識別子
成功/失敗 true  文字列の受信に成功しかつ*textと*lenのマッチングに成功
false 上記以外
解説 *mに代入されるメッセージの種類は以下の通りです。

(CONNECT *socket) : 接続した
(RECEIVE *socket) : 受信した
(DISCONNECT *socket) : 切断した
  *socket ソケット識別子を表す整数

 


述語名/引数 (ic:disconnect *ic)
要約 接続を終了します。
互換性 Win
引数 *ic [in} 接続を表す識別子
成功/失敗 true  切断が成功した
false 切断が失敗した。
解説  

 


述語名/引数 (ic:asyncDisconnect *ic *result)
要約 接続を終了します。
互換性 Win
引数 *ic [in} 接続を表す識別子
*result [out] エラーコード
  0     成功
  0以外 失敗(内部エラーコード)
成功/失敗 true  切断が成功した
false 切断が失敗した。
解説 asyncConnectで確立した接続は、このルールを用いて終了します。

 


述語名/引数 (ic:cleanup *error)
要約 Socketの使用を終了します。
互換性 Win
引数 *error [in} エラーコード
  0     成功
  0以外 失敗(内部エラーコード)
成功/失敗 *errorのマッチングに依存
解説  

 

/**
 *Socketによる接続の例
 *
 *このサンプルは、始めにETIで(test2)を実行しサーバを起動して、その後別のETIで(test1)を実行する。
 *(test2)で(test1)から要求されたappに関するクエリを実行しその結果をクライアント(test1)に返す。

 */

//********************************************クライアントの例**************************************
/**
 *サーバに接続して、アペンドに関するクエリを送信し、実行結果を受け取る。
 */
(test1)-->
(loadModule "ic.dll" *m),//モジュールロード
(gsetv CONTINUE yes),
(ic::asyncConnect "127.0.0.1" 45678 *ic),//127.0.0.1にポート番号45678で接続する。*icは接続を表す識別子。
(ic::sendString *ic "(((ans (app *1 *2 (1 2 3 4 5 6 7 8 9 10))) (app *1 *2 (1 2 3 4 5 6 7 8 9 10))(app *1 *3 *4) ))" *len1),//文字列を送る。*len1は送ったデータの長さ(終端記号を含む)。
(cloop *ic),
(getv ANS *s),
(print *s),
(ic::asyncDisconnect *ic *Re),//切断
(ic::cleanup ?),//socket開放
(freeModule *m).//モジュール開放

/**
メッセージループ
*/

(cloop *ic),{(ggetv CONTINUE yes)}-->
(ic::getMessage *m),(cmh *m *ic), (cloop *ic).
(cloop *ic)-->.

//メッセージハンドラ
/**
クライアントが接続したときの処理
*/

(cmh (CONNECT *socket) *ic)-->
(printf "connected to %d.\n" (*socket)),
(ggetv CL *n),(:= *nn (+ *n 1)),(gsetv CL *nn).

/**
メッセージを受け取ったときの処理
*/

(cmh (RECEIVE *socket) *ic)-->
(ic::getText *ic *text),(sread *text *s), (setv ANS *s), (gsetv CONTINUE no).
/**
クライアントが切断したときの処理
*/

(cmh (DISCONNECT *socket) *ic)-->
(printf "disconnected from %d.\n" (*socket)),
(ggetv CL *n),(:= *nn (- *n 1)),(gsetv CL *nn),
(continue *nn).

/**
 *その他
 */

(cmh ? *ic)-->.

//**********************************************サーバの例******************************************
/**
 *サーバとしてクライアントからクエリを受け取り実行して結果を送信する
 */

(test2)-->
(loadModule "ic.dll" *m),
(ic::initializeServer 45678 *ic),//サーバを初期化し起動する。*icはサーバの識別子
(loop *ic),//メッセージループ
(ic::cleanup ?),//ソケット開放
(freeModule *m).//モジュール開放

/**
 *メッセージループ
 */

(loop *ic)-->(ic::getMessage *m), (mh *m *ic), (loop *ic).

//メッセージハンドラ
/**
 *クライアントが接続したときの処理
 */

(mh (CONNECT *socket) *ic)-->
(printf "connected to %d.\n" (*socket)).

/**
 *メッセージを受け取ったときの処理
 */

(mh (RECEIVE *socket) *ic)-->
(ic::getText *ic *socket *text),
(sread *text *clauses),
(createRootWorld *w),
(setDDWorld *clauses *w),
(callRootWorld *w 1000),
(getDDWorld *newClauses *w),
(sformat *s "/a" (*newClauses)),
(killRootWorld *w),
(ic::sendString *ic *socket *s *len).
/**
 *クライアントが切断したときの処理
 */

(mh (DISCONNECT *socket) *ic)-->
(printf "disconnected from %d.\n" (*socket)).
/**
 *その他
 */

(mh ? ?)-->.


(Rule app (Head (app *X *Y *Z))
(Body (exec (= *X ())(= *Y *Z)))
(Body (exec (= *X (*A|*X1))(= *Z (*A|*Z1)))(app *X1 *Y *Z1)))