3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

日本語プログラミング言語Mindの小技 「listen」~Mindのソケット通信ライブラリ~

Posted at

はじめに

日本語プログラミング言語Mindの小技「listen」について説明したいと思います。

対象読者

日本語プログラミング言語Mindのユーザー、または日本語プログラミング言語に興味のある方

この小技に関連するMind言語マニュアル

この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載はありません。

Mind7の付属の上級者向けドキュメントmind7\doc\socketlib.docmに記載があります。

2-2 処理単語解説(ソケット)
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

■listen
    --------------------------------
    <ホスト名> <ポート番号> <キューサイズ> listen
       → LISTENソケット
    --------------------------------
 内部では次のことが行われます。
  (1) ホスト名をIPアドレスに変換。名前で書かれていた場合には
gethostbyname()を実行
(2) socket() を実行(パラメータは [AF_INET, SOCK_STREAM, 0] です)
(3) bind() を実行
(4) listen() を実行(ここでキューサイズが使われます)
 エラーリターンが有ります。戻ったら必ずエラーを調べてください。

■accept
    --------------------------------
<LISTENソケット> accept → ソケット
    --------------------------------
 内部で accept() を実行します。これで得られたソケットで以後のデータの読み書きを行います。
 エラーリターンが有ります。戻ったら必ずエラーを調べてください。

■connect
    --------------------------------
    <ホスト名> <ポート番号> connect → ソケット
    --------------------------------
 内部では次のことが行われます。
  (1) ホスト名をIPアドレスに変換。名前で書かれていた場合には
gethostbyname()を実行
(2) socket() を実行(パラメータは [AF_INET, SOCK_STREAM, 0] です)
(3) connect() を実行
 エラーリターンが有ります。戻ったら必ずエラーを調べてください。

本機能(本記事)は、下記のバージョンに対応しています。Mind8のLinux版も対応していると思いますが、本記事では特に検証を行っておりません。

対応バージョン

■Mind7 ■Mind8 ■Mind9
■Windows版 □Linux版

小技の解説

Mindの小技「listen」は、Mindのソケット通信ライブラリ機能でコネクションを確立する機能の1つです。これに関連した単語は下記の3つとなります。
「listen」「accept」「connect」

「listen」と「accept」はサーバー側で使用します。
「connect」はクライアント側で使用します。

「listen」と「connect」はどちらも内部でいったん「listen/connect」という共通単語を使用しております。APIのlisten()またはconnect()を実行する手前の処理で共通処理があるため、このような実装となっているようです。socketlib.docmの各単語の処理概要でもそのあたりはつかむことができます。

listen/connectとは
 (ホスト名、ポート場号、リッスンキューサイズ → 仮想ハンドル)

「listen」はリッスンキューサイズを指定して「listen/connect」を呼び出しています。今回は1対1の接続サンプルを実装するため、キューサイズ1で書いています。
「connect」はリッスンキューサイズ0固定で「listen/connect」を呼び出す単語です。

「listen/connect」はリッスンキューサイズが1以上の場合はlisten() を実行
0の場合は
connect() を実行
のように内部でAPIの実行を振り分けています。

本記事ではシンプルなサンプルとしてサーバ側とクライアント側で1対1で通信確立し、クライアント側で入力した文字列をおうむ返しする処理を実装します。

ソケット通信の概念をつかみやすくるため、ホスト名やポート番号は固定書きの超シンプル版です。

具体的には下記の記事で実装したサンプルプログラムで、Mind7互換単語の「コネクション確立1対1・サーバ側」を実装し「コネクション確立・クライアント側」のヶ所を修正して、動くようにします。

Mindプログラムソース

サーバー側

socketsrv2.src
サンプルホスト名は 文字列定数 "localhost"。
サンプルポート番号は 数値   1000。

コネクション確立1対1・サーバ側とは (ホスト名、ポート番号 → ソケット)
     リッスン用ソケットは 		    変数

    (ホスト名と ポート番号で)
  1個で listenし リッスン用ソケットに 入れ
	エラー?
    ならば エラー文字列を 一行表示し 実行終わり
	つぎに
	リッスン用ソケットで acceptし (→ 別のソケット)
	リッスン用ソケットを ソケットクローズしておく。

コネクション確立とは (ホスト名、ポート番号 → ソケット)
     ソケットは 		    変数

    (ホスト名と ポート番号で)
	コネクション確立1対1・サーバ側し ソケットに 入れ
    エラー?
    ならば  エラー文字列を 一行表示し 実行終わり
    つぎに
    ソケットをかえす。

サーバー側ソケット通信とは (ソケット → ・)
     ソケットは 		    変数
		受信文字列は      文字列
		送信文字列は      文字列

    ソケットに 入れ
    ここから
		ソケットから ハンドル指定で一行読み出し 受信文字列に 入れ
		データ終り?
			ならば 「クライアントの終了を検知しました。」を 一行表示し
				  打ち切り
			つぎに
		「受信データ=」を 表示し 受信文字列を 一行表示し
        送信文字列に 受信文字列を 入れ
		送信文字列を ソケットに ハンドル指定で一行書き込み
	繰り返し。


メインとは (・ → ・)
         ソケットは 		    変数

    「ソケット通信サーバー側を起動しました。クライアントからの接続を待機しています。」を
        一行表示し
    サンプルホスト名と サンプルポート番号で 
            コネクション確立し ソケットに 入れ
    「クライアントとの接続を確立しました。クライアントからの送信を待機しています。」を
        一行表示し
    ソケットで サーバー側ソケット通信し
	ソケットを ハンドル指定でクローズし
  「ソケット通信サーバー側を終了しました。」を  一行表示すること。
    

Mind7の「コネクション確立・サーバー側」と互換実装の「コネクション確立1対1・サーバー側」を定義して、内部で「listen」「accept」を使用しました。

クライアント側

socketclt2.src
サンプルホスト名は 文字列定数 "localhost"。
サンプルポート番号は 数値   1000。

コネクション確立とは (ホスト名、ポート番号 → ソケット)
     ソケットは 		    変数
		受信文字列は      文字列
		送信文字列は      文字列

    (ホスト名と ポート番号で)
	connectし ソケットに 入れ
    エラー?
    ならば エラー文字列を 一行表示し 実行終わり
    つぎに
    ソケットをかえす。

クライアント側ソケット通信とは (ソケット → ・)
     ソケットは 		    変数
		受信文字列は      文字列
		送信文字列は      文字列

    ソケットに 入れ
    ここから
    	文字列入力し 送信文字列に 入れ
		送信文字列が 空列?
			ならば 打ち切り
			つぎに
		送信文字列を ソケットに ハンドル指定で一行書き込み

		ソケットから ハンドル指定で一行読み出し 受信文字列に 入れ
		データ終り?
			ならば 「サーバーの終了を検知しました。」を 一行表示し
				  打ち切り
			つぎに
		「受信データ=」を 表示し 受信文字列を 一行表示し
	繰り返し。

メインとは (・ → ・)
         ソケットは 		    変数

    サンプルホスト名と サンプルポート番号で 
             コネクション確立し ソケットに 入れ
    「ソケット通信クライアント側を起動しました。何か入力してください。(Enterで終了)」を
        一行表示し
    ソケットで クライアント側ソケット通信し
	ソケットを ハンドル指定でクローズし
  「ソケット通信クライアント側を終了しました。」を  一行表示すること。

Mind7の「コネクション確立・クライアント側」は「connect」の別名でしたので、そこを修正しました。

コンパイル結果

ではコンパイルしてみます。下位ライブラリはsocketlibを指定します。

Mind9

下図はMind9βです。

c:\developments\vscode\mind9>mind socketsrv2 socketlib       

日本語プログラミング言語 Mind Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\mind9-beta\mind9-beta\bin\mindex.exe --> socketsrv2.exe

c:\developments\vscode\mind9>mind socketclt2 socketlib 

日本語プログラミング言語 Mind Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\mind9-beta\mind9-beta\bin\mindex.exe --> socketclt2.exe

Mind8

c:\developments\vscode\mind9>mind socketsrv2 socketlib

日本語プログラミング言語 Mind Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> socketsrv2.exe

c:\developments\vscode\mind9>mind socketclt2 socketlib 

日本語プログラミング言語 Mind Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> socketclt2.exe

Mind7

C:\developments\vscode\mind9>mind socketsrv2 socketlib
日本語プログラミング言語 Mind Version 7.5 for Windows
          Copyright(C) 1985-2004 Scripts Lab. Inc.
          Single user license.  Serial No:********
コンパイル中 - 終了
Coping.. C:\mind7\bin\mindexec.exe -> socketsrv2.exe

C:\developments\vscode\mind9>mind socketclt2 socketlib
日本語プログラミング言語 Mind Version 7.5 for Windows
          Copyright(C) 1985-2004 Scripts Lab. Inc.
          Single user license.  Serial No:********
コンパイル中 - 終了
Coping.. C:\mind7\bin\mindexec.exe -> socketclt2.exe

実行結果

つづいて実行してみます。Mind8の結果ですが7/9βも同様です。

コマンドプロンプトターミナルは2つ起動します。
最初にサーバーを起動します。

c:\developments\vscode\mind9>socketsrv2
ソケット通信サーバー側を起動しました。クライアントからの接続を待機しています。

これは起動しただけで、「コネクション確立1対1・サーバ側」はまだ実行していません。
つづいてクライアント側を起動します。

C:\developments\vscode\mind9>socketclt2
ソケット通信クライアント側を起動しました。何か入力してください。(Enterで終了)

このとき、サーバー側では「コネクション確立1対1・サーバ側」の実行が完了して、下記のように接続確立のメッセージが表示されます。

c:\developments\vscode\mind9>socketsrv2
ソケット通信サーバー側を起動しました。クライアントからの接続を待機しています。
クライアントとの接続を確立しました。クライアントからの送信を待機しています。

クライアント側でコンソールからメッセージを入力します。下図はEnterキー押下前です。

C:\developments\vscode\mind9>socketclt2
ソケット通信クライアント側を起動しました。何か入力してください。(Enterで終了)
こんにちは。

クライアント側でEnterキー押下すると、サーバーがメッセージをおうむ返ししてきます。

C:\developments\vscode\mind9>socketclt2
ソケット通信クライアント側を起動しました。何か入力してください。(Enterで終了)
こんにちは。
受信データ=こんにちは。

サーバー側もメッセージを受信したことがわかります。

c:\developments\vscode\mind9>socketsrv2
ソケット通信サーバー側を起動しました。クライアントからの接続を待機しています。
クライアントとの接続を確立しました。クライアントからの送信を待機しています。
受信データ=こんにちは。

クライアント側でEnterキーのみ押下して終了します。

C:\developments\vscode\mind9>socketclt2
ソケット通信クライアント側を起動しました。何か入力してください。(Enterで終了)
こんにちは。
受信データ=こんにちは。

ソケット通信クライアント側を終了しました。

C:\developments\vscode\mind9>

サーバー側も終了したことがわかります。

c:\developments\vscode\mind9>socketsrv2
ソケット通信サーバー側を起動しました。クライアントからの接続を待機しています。
クライアントとの接続を確立しました。クライアントからの送信を待機しています。
受信データ=こんにちは。
クライアントの終了を検知しました。
ソケット通信サーバー側を終了しました。

c:\developments\vscode\mind9>

いかがでしょうか?1対1のソケット通信で、コネクション確立、ソケット通信、終了のステップのイメージがつかめれば幸いです。

参考情報

この小技「listen」を使った記述例の記事は未発見です。

おわりに

いかがでしたでしょうか?なにかの参考になれば幸いです。2025年は日本語プログラミング言語Mind生誕40周年です。

本記事シリーズのご紹介

本記事シリーズ「日本語プログラミング言語Mindの小技」は「日本語プログラミング言語Mind生誕40周年プロジェクト」の一環です。

興味を持たれた方は日本語プログラミング言語Mind公式サイトにアクセスすると、Mindコンパイラをダウンロードできますよ。

面白い!、楽しい、カンタン、難しいのも書ける!みんなでやってみよう:relaxed:

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?