ネットワーク・並行プログラミング・分散オブジェクト

ソケットなどのネットワークプログラミング、分散オブジェクト (主にCORBA)、リモートプロシージャコール (RPC) などを扱います。

並行、並列、分散はこんな感じでしょうか。

並行 (concurrent)
論理的に複数のタスクが同時に動く。逐次の対義語。時分割などで擬似的に実現されているかもしれない。
並列 (parallel)
複数のCPU (コア) で同時に複数のタスクを動かす
分散 (distributed)
複数のシステム(コンピュータ)で複数のタスクを同時に動かす

分散オブジェクト

CORBA

omniORBのインストール
[2017-05更新] C++ / Python に対応した CORBA ORB.
CORBA again
[2017-05更新] 異なるプログラミング言語の間でRPC. 生き残っている.
ORBit2
GNOMEのCORBA ORB、ORBit2の使いかた. ※ORBit2はすでに廃れている。例えば, omniORB は現在も維持されている。
CORBA ORBインターフェイス
CORBA仕様で定義されるORBのインターフェイス
Bonobo components
GNOMEの分散コンポーネント技術Bonoboの使いかた

そのほか

Thrift RPC: Non-blockingサーバのサンプル [C++]
[2019-09] ポータビリティの高い、簡易なRPC. 複数のクライアントからの呼び出しに対応するには、それなりの書き方をしなければならない。
Rubyで分散オブジェクト (dRuby)
Ruby標準のpure RubyなORB、dRubyの使いかた

Java専用の分散技術RMI (Remote Method Invocation) のテスト。

Java 11: RMI over IIOP を IIOP を使わないよう書き換える

ネットワーク・並列コンピューティング

IPv4アドレス枯渇と高くついたIPv6 (メモ)

IPv6ソケットのサンプルのシリーズ。

  1. IPv6ソケットプログラミング [C++] IPv4/IPv6両対応のプログラムの書き方。サーバ, クライアントのサンプル.
  2. Non-blocking ソケットで IPv4/IPv6両対応 (クライアント側) [C++] [GTK4] GTK4 のイベントループと組み合わせる。
  3. Qt GUIアプリでのマルチスレッド・非同期ソケット通信 [C++] [Qt5/Qt6] Qt の signal, slot の力を活用.
  4. libuv C10K〜C100K サーバサンプル [C++] 非同期I/O で同時接続1,000 を超える.

HTTP/2 を実装してみる。

streambuf を拡張し, ソケット対応 [C++]
IOストリーム.
HTTP/2 クライアント実装サンプル (非TLS)
HTTP/2 over TCP. [2018.6] new!
HTTP/2 クライアント実装サンプル (TLS版)
HTTP/2 over TLS. [2018.6] new!
HTTP/2サンプル実装 (共通ルーチン)
上記, HTTP/2 非TLS版, TLS版の共通ルーチン.
MPICH2のインストール
クラスタ環境の用意。

スレッド

スレッドプログラミング (pthread)
UNIXでのスレッドプログラミング。

minichat

 ソケット非同期通信のテスト。サーバーはLinux,クライアントはWindows, Linux, Java版を用意した。

 Java版はスタンドアロン,アプレットのいずれとしても動作し,JDK 1.2 on Windows, JDK 1.1.6 on Linux, Netscape Navigator 4.5 on Windowsで確認した。Internet Explorer 4.0, Netscape Navigator 4.07 on Linuxでは動かなかった。IEで動かなかったのは,かなり謎。

 Java版をアプレットとして動かすとき,ユーザー名,サーバーのポート番号を決め打ちしてる(*1)ので,ソースを修正しないといけない。また,Javaアプレットはダウンロード先のホストとしか通信できないので,.classファイルをWebサーバーに置く。

 エンコーディングの変換をしてないので,異なるOS間では日本語は通らない。Linux版はEUC-JP, Windows版はShift_JISでいいんだが,Java版が難しい(*2)。

Note.

(1999.08.09追記) Windowsでの標準エンコーディングはシフトJISではない。ISO/IEC 646 IRVとJIS X 0208をエンコードした「932」。

*1: アプレットからダイアログボックスを出す方法,あるいはgetlogin()に相当する方法が分からなかった。

*2: 標準のエンコーディングがMS932, ISO8859_1, SJISと多様で,どの環境でも使えるエンコーディング,又は実行時に使えるエンコーディング一覧を取得する方法がない。Javaは内部UnicodeなのにUTF-8を指定したらJava2 VM以外例外を投げるし。自前でUTF-8変換すればいいが,今度はLinux版でiconv()がないため,EUC-JPとエンコーディング変換する標準的な方法がない。あぅ。