Chapter4. 拡張関数


4.7 通信関数

関数名
P@SRVMAKE
機能
サーバの通信を開始する
書式
P@SRVMAKE(PORT,"暗号認証コード",level)
《パラメーター》
PORT int。通信に使うサーバ側のポート番号(1〜65535)
暗号認証コード char:0〜8文字の文字列(大文字小文字を区別します。記号使用可、漢字使用可)
暗号と認証用のキーワード
省略可
level (未実装)int:暗号強度を設定
省略可
0:認証を行う(デフォルト)、認証には暗号を使用する。
1:認証と暗号を行う
戻り値 0:通信開始失敗
0以外:通信正常開始。戻り値はサーバ番号となる。
解説
本関数を実行すると、他のパソコンからの接続を受け入れられるようになります。接続を受け付けるサービスを「サーバサービス(以後サーバ)」と呼びます。接続してくるパソコンを「クライアント(ユーザ)」と呼びます。TCP/IPの通信では、IPアドレスとポート番号で接続相手とサービスを特定して接続します。この接続点をポートと呼び、1つのポートに複数のクライアントが接続できる。また、ポート番号が重複しなければ1つのサーバで複数のポートを作ることができる。
ポート番号には1〜65535を指定できますが、決め事として1024〜32767の範囲で使用する事になっています。これは1〜1023が標準規格として既に使用するアプリが登録されているからです。(例えばWebサーバは一般的に80や443を使用してます)また、32768〜65535はパソコンが動的に割り当てて使用する範囲と決まっています。
本関数の実行に成功すると戻り値としてサーバ番号を返す。P@SRVGETUSERにこのサーバ番号を渡し接続してくるユーザ(ユーザ番号)を取得する。以後その接続したユーザと通信するにはユーザ番号を使用する。
不要になったときはP@CLOSEで解放すること。
暗号コードは通信の暗号を行う際のキーワードになります。通信の暗号化はセキュリティの観点から第三者に通信の内容を見せないようにするという目的があります。暗号化した通信は正規のアプリ間同士でのみ複合化し見れるようにしたいために、お互いしか知りえない共通のキーワードで暗号・複合を行います。なるべく暗号コードを行うようにしてください。
用例
ユーザがサーバに接続するとサーバからメッセージが送られる。そして直ぐに切断される。サーバアプリを実行後、クライアントを実行する。クライアントは複数実行できる。
//サーバ
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