Chapter4. 拡張関数


4.7 通信関数

関数名
P@USERMAKE
機能
サーバへの接続を開始する。
書式
P@USERMAKE( IP , PORT, "暗号認証コード",level)
《パラメーター》
IP int。接続したいサーバのIPアドレスまたはドメイン名
ex) 「"192.168.0.1"」「"www.jppass.com"」
PORT int。接続したいサーバのポート番号(1〜65535)
暗号認証コード char:0〜8文字の文字列(大文字小文字を区別します。記号使用可、漢字使用可)
暗号と認証用のキーワード
省略可
level (未実装)int:暗号強度を設定
省略可
0:認証を行う(デフォルト)、認証には暗号を使用する。
1:認証と暗号を行う
  
戻り値 0:通信開始失敗
0以外:正常に通信を開始した。戻り値は通信相手のサーバを示すサーバ番号となる。
解説
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