Chapter4. 拡張関数


4.7 通信関数

関数名
P@USERGETSTATE
機能
サーバとの通信状態を取得する
書式
int P@USERGETSTATE( server )
《パラメーター》
server int。サーバ番号を指定する
  
戻り値 −1:通信エラー
0:接続処理中
1:接続完了。通信可能
解説
P@USERGETSTATEと組み合わせて使用する。本関数を実行しても直ぐにはサーバとの通信は完了しない。その後にP@USERGETSTATEを実行し接続の結果を取得する。しかし、この接続の結果も1回で取得できない可能性があるので、何度もP@USERGETSTATEを実行する。
同一クライアントから同一サーバに本関数を使い通信することができる。また複数のサーバに接続することもできる。
ポート番号および暗号認証コード、levelには接続するサーバで実行するP@SRVMAKEと同じ指定をする。
P@USERGETSTATEの実行に成功すると戻り値としてサーバ番号を返すので、当該サーバとの通信はこのサーバ番号を指定して行う。
不要になったときはP@USERCLOSEで解放すること。 
用例
ユーザがサーバに接続するとサーバからメッセージが送られる。そして直ぐに切断される。サーバアプリを実行後、クライアントを実行する。クライアントは複数実行できる。
//サーバ
S@BACKGROUND( 2 )                    //非アクティブでも動かす
CH = G@SETUP(300,200,16,1)           //画面初期化
SV = P@SRVMAKE( 5000 )               //サーバ通信開始
LOOP
  G@CHRCLEAR( CH )                   //画面クリア
  UU = P@SRVGETUSER( SV )            //クライアント接続チェック
  IF UU <> 0 THEN                    //接続した?
    MOJI$="接続してきました"
    P@PUSHSTR(UU,"やっほー")         //送信メッセージ登録
    P@SEND(UU)                       //送信
    P@CLOSE( UU )                    //クライアント切断
  ELSE
    MOJI$="接続待ち"
  ENDIF
  G@PRINT(CH,0, 0,MOJI$)
  G@FLIP()                           //画面更新
  S@SLEEP(500)
ENDLOOP
 
//クライアント
S@BACKGROUND( 2 )                    //非アクティブでも動かす
CH = G@SETUP(300,200,16,1)           //画面初期化
SV = P@USERMAKE("127.0.0.1" , 5000)  //サーバに接続開始
RMODE=0
LOOP
  G@CHRCLEAR( CH )                   //画面クリア
  IF SV <> 0 THEN                    //接続待ち or 接続中
    PRET = P@USERGETSTATE( SV )      //接続状態チェック
    SELECT
    WHEN PRET=0:                     //接続中?
      MOJI$="接続中…"
      BREAK
    WHEN PRET=1:                     //接続完了?
      MOJI$="接続しました"
      RMODE=1                        //受信可能とする
      BREAK
    WHEN PRET=-1:                    //接続失敗?
      MOJI$="接続失敗"
      SV = 0
      BREAK
    ENDSELECT
    IF RMODE = 1 THEN                //受信可能?
      IF 0 < P@RECV(SV) THEN         //受信 and 受信した?
        MOJI2$=P@POPSTR(SV)          //受信文字列取得
        P@CLOSE(SV)                  //サーバと切断
        SV=0
      ENDIF
    ENDIF
  ENDIF
  G@PRINT(CH,0, 0,MOJI$)
  G@PRINT(CH,0,20,MOJI2$)
  G@FLIP()                           //画面更新
ENDLOOP