Internet対応ActiveXコントロールの使い方(TCP/IP系)

Updated 1997/07/03

By 富士通SSL)福岡寿和


Internet対応ActiveXコントロールがやってきた
基本中の基本−プロトコル−を知ろう
IPプロトコルの概要
TCPプロトコルの概要
Winsockコントロール(TCP)の使い方
UDPプロトコルの概要
UDP Winsockコントロールの使い方
TCPを使ったn階層C/Sシステムを作る


Internet対応ActiveXコントロールがやってきた

「MicrosoftのInternet戦略」の真打ちVisual Basic 5.0がやってきました。Visual Basic 5.0のInternet対応ActiveXコントロールと言えば、ActiveX DocumentsなどのWWW系ActiveXコントロールが脚光を浴びています。しかし、Internet対応の軽量級ActiveXコントロールを使えば、 より自由度の高いシステムを構築することができます。

Internet対応ActiveXコントロールと聞いて、ICPβ版(Internet Control Packβ版)を思い浮かべる人も多いかもしれません。マイクロソフトは、ICPβのWWWでの配布を終了したときに「次期Visual Basicでは、ICPβよりも高性能のActiveXコントロールを提供する」とアナウンスをしたので、Visual Basic 5.0の発売を待っていた人も多いでしょう。マイクロソフトはVisual Basic 5.0で、表1のコントロールをICPの代わりに添付してきました。

表1 Internet対応ActiveXコントロール
コントロールサポートするプロトコル
Microsoft Winsock Control 5.0 Transmission Control Protocol (TCP)
User Datagram Protocol (UDP)
Microsoft Internet Transfer Control 5.0
File Transfer Protocol (FTP)
Gopher
Hyper Text Transfer Protocol (HTTP)
Secure HTTP (HTTPS)

しかし、残念なことにICPβからNNTP、SMTPおよび POP3などの伝統的なアプリケーション層プロトコルが削除されています。 ICPβで先行開発していた場合は、Internet対応ActiveXコントロールとの違いに注意してください。

Internet対応ActiveXコントロールは、プロトコルごとではなく、階層ごと(TCPやUDPのトランスポート層のものとHTTPなどのアプリケーション層のもの)になっている点が大きく異なります。HTMLコントロールも除かれています。ICPβのコントロールを前提に開発を進めていた場合は、MAPIなどを使うかActiveXベンダーから発売されているSMTPおよびPOP3のActiveXコントロールを使うように方向修正する必要があります。

Microsoft Internet ControlsというそのものずばりのActiveXコントロールを[プロジェクト]-[コントロール]メニューの下で発見した人もいると思いますが、このコントロールは、Internet Explorerが提供しているものでVisual Basic 5.0のコントロールではありません。

基本中の基本−プロトコル−を知ろう

プロトコルは、複数のプログラムがネットワークを通して情報をやり取りする約束事(どんな手段で、どこの国の言葉で、誰と、どんな話題を話すか など)です。ですから、TCP/IPプロトコルを使うことを「TCP/IPで話す」と言うことがあります。また、この1つ1つの約束事をOSI(Open System Interconnection)の7階層モデルを使って説明することが多いようですが、インターネット系のプロトコルはもう少し簡単な階層モデルで説明することができます(表2)。

表2 Internetの階層モデル
階層プロトコル役目
アプリケーションHTTP、HTTPS、 FTP、 GopherなどInternet上の各種サービスを提供○○サーバーの○○に相当
トランスポートTCP、UDP相手アプリケーションを特定する
インターネットIPなど相手コンピュータを特定するために世界レベルのアドレス方式を提供
ネットワークEthernet、 PPPなど通信回線に流すデータ形式を提供10Base-Tなどの通信回線

Internet対応ActiveXコントロールは、以上のように6つのプロトコルをサポートしています。この中でも、業務アプリケーションを構築するときに重要なのが、Winsockコントロールの2つのプロトコルです。
Internet Transferコントロールの方はプロトコルに対応するサーバーが別にあるときに、そのサーバーと会話する目的で使います。
しかし、Winsockコントロールを使えば、これだけで、クライアント側もサーバー側も作れます。
Winsockコントロールで独自のアプリケーション層プロトコルを作ってしまえば、RemoteOLEもDCOMもWWWサーバも必要ないn階層C/Sシステムが構築できます。また、 Visual Basic 5.0に付属していないプロトコルをサポートすることも可能です。
例えば、メールサーバーのポート25に接続してSMTPで会話するようなアプリケーションを作れば、MAPIや受信トレイを使わなくても電子メールを送信することができます。

そのためには、まず、TCPプロトコルとUDPプロトコル、更にその下層にあたるIPプロトコルについて知っておく必要があります。

IPプロトコルの概要

Winsockコントロールで提供されているTCPおよびUDPプロトコルは、IPプロトコル上で動作します。
そのため、IPプロトコルの設定が正しく行われていないとWinsockコントロールは動作しません。
この設定は、クライアントアプリケーションとサーバーアプリケーションの両方を同じコンピュータ上で動作させるときにも必要です。

TCPプロトコルの概要

Winsockコントロールがサポートするプロトコルの中で重要なのがTCPプロトコルです。なぜなら、FTP、HTTPなどは、TCPプロトコル上で実現されているからです。また、TCPはトランスポート層のプロトコルにあたるので、コンピュータ上のアプリケーションを特定するためのプロトコルにあたります。TCPは次のような特徴があります。

  1. ストリーム
    TCPが提供するサービスは、ストリーム(Stream)と呼ばれることもあります。
    これは、送信側が送出したバイト列がそのままの順序で相手に届くということです。
    また、TCPのストリームは、レコードの区分やデータ種別などのデータ構造を持たない点も注意してください。
    どのような順番でどのようなデータ(String型やDate型をそのまま送受信することも可能です)を送受信するかは、TCPがサポートしているのではなく、TCPを使うアプリケーション同士の取り決め(プロトコル)になります。
  2. コネクション
    TCPは、通信と行うソフト同士にコネクションと呼ばれる仮想的な通信路を設定します。
    そのため、通信を行う前にクライアントアプリケーションからコネクションを確立要求を行う必要があります。
  3. 全二重通信
    TCPのコネクションは、双方向の同時転送ができます。
    そのため、2つのアプリケーションの間では、基本的に1本のコネクションでデータの送受信が可能となります。
    つまり、TCPにおけるクライアントとサーバーの関係は、コネクションの接続要求を行う側がクライアントというだけです。
    一度コネクションが接続されてしまえば、データの送受信にクライアントとサーバーの区別はなくなります。

TCPは、0〜65、535のポート番号で相手先を特定します(相手コンピュータの特定は、IPがIPアドレスで行います)。つまり、TCPを使うクライアントアプリケーションは、接続したいサーバーアプリケーションに対応したポート番号を指定して接続要求を行います。SMTPやPOP3などの標準的なサーバーアプリケーションには、0〜1、023までのポート番号が予約されています(表3)。

表3 予約済みポート番号(抜粋)
Noアプリケーション
20FTP(Data)TCP
21FTPTCP
23TELNETTCP
25SMTPTCP
53DNSTCP/UDP
70gopherTCP
80WWWTCP
119NNTPTCP
161SNMPUDP
162
513rloginTCP

したがって、TCPを使って独自プロトコルを作る場合は、1、024以上の空いているポート番号を使います。ポート番号を決定したら(このポート番号も独自プロトコルの仕様になります)、サーバー側にその値を登録します。
サーバーがWindows NTであれば、winnt\system32\drivers\etc\serviceを修正します。Windows 95のときは、windows\serviceを修正します。
Windowsでは、このファイルを修正しなくてもサーバーアプリケーションが動作するようですが、他とポート番号が重複しないように、業務用のサーバーアプリケーションを作った場合は、必ず修正してください。

Winsockコントロール(TCP)の使い方

Winsock コントロールでTCPを使うには、ProtocolプロパティにsckTCPProtocolを指定します。 TCPを指定したときに有効なWinsockコントロールのプロパティ、メソッド、イベントを表4にまとめました。

表4 Winsockコントロール(TCP)のプロパティ、イベント、メソッド一覧
プロパティ
BytesReceive受信バッファ内にあるデータサイズ取得
LocalHostName自コンピュータ名取得
LocalIP自コンピュータのIPアドレス取得
Localport自アプリケーションのポート番号設定取得
Protocol0 - sckTCProtocolを設定取得
RemoteHost相手コンピュータ名またはIPアドレス設定取得
RemoteHostIP相手コンピュータのIPアドレス取得
RemotePort相手アプリケーションのポート番号設定取得
SocketHandleソケットハンドル取得
State接続状態取得
定数内容
sckClosed0閉じてます
sckOpen1開いてます
sckListening2接続要求を待っています
sckConnectionPending3接続がペンディング状態です
sckResolvingHost4相手コンピュータ名取得中
sckHostResolved5相手コンピュータ名の取得完了
sckConnecting6接続処置中です
sckConnected7接続が完了しました
sckClosing8相手が接続を閉じようとしています
sckError9エラー
メソッド
Accept相手アプリケーションからの接続要求を受け付けます
BindListenするソケットを特定のポートに割り当てます
Close現在の接続を切断します
Connect相手アプリケーションに接続要求を送信します
GetData相手アプリケーションの送信データを取得します
Listen相手アプリケーションからの接続要求を待ちます
PeekData相手アプリケーションの送信データを参照します
SendData相手アプリケーションにデータを送信します
イベント
Close接続が切断されました
Connect接続処理が完了しました
CnnectionRequest接続要求が来ました
DataArrivalデータが届きました
Errorエラーが発生しました
SendCompleteデータの送信が完了しました
SendProgress送信中にのみ送信状態の通知します

TCPは、全二重通信ができるので、コネクションが確立するとクライアント側とサーバー側の差はなくなります。しかし、コネクションが確立する前の動作としては、サーバー側は、常に動作していてコネクション確立要求を待ち、クライアント側はサーバーと接続したいときに起動されコネクションの確立要求をします。したがって、プログラムにはサーバー側とクライアント側でプロトコルの設定方法に差があります。

以上のような設定方法を踏まえた簡単なTCPのサンプルプログラムを紹介しておきます( リスト1リスト2および 図1図2)。リスト1がTCPサーバーで、リスト2がTCPクライアントになります。

サーバー、クライアント共に必要最小限度の機能しかありませんが、TCPサーバーのDataArrivalイベントのGetDataからSendDataまでの間に独自のアプリケーション層プロトコルを作り込んでいけば、様々なサーバーができ上がります。
また、リスト2のTCPクライアントからすでにあるSMTPなどのサーバーと会話することもできます。ただし、アプリケーション層プロトコルをきちんと使うときには、Internetの標準に従うようにしましょう。SMTPなどのプロトコルは、RFC (Request For Comments)という規格で標準が定義されているので、該当するRFCを入手してコーディングしてください。RFCは、 ftp://ds.internic.net/rfc などから入手することができます。また、メール関係のスタンダードとしては、SMTPはRFC821、MIMEはRFC1521、POP3はRFC1725で定義されています。

UDPプロトコルの概要

UDPは、TCPと異なりコネクションレス型のプロトコルです。そのため、TCPに比べて高速ですが、信頼性はIPと同程度です。UDPを使うアプリケーションは、次のような特徴があります。
  1. ある範囲内に同報が必要なもの
    DHCPなど
  2. データが短く単発的なもの
    DNSなど
  3. 信頼性よりも高速さを優先したもの
    TFTPなど
  4. 上位層で信頼性を作り込んだもの
    NFSやDCOMなど

UDP Winsockコントロールの使い方

TCPが特定の相手に向けてデータを送信するのと比較して、UDPは、 Internet上の一定範囲(通常はサブネット内)にデータを送信します。TCPが電話だとすれば、UDPは無線に相当します。また、Winsockコントロール(UDP)のプロパティ、メソッド、イベントは、TCPを使う場合よりもかなり数が少なく簡単になっています(表5)。

表5 Winsockコントロール(UDP)のプロパティ、イベント、メソッド一覧
プロパティ
LocalHostName自コンピュータ名取得
LocalIP自コンピュータのIPアドレス取得
Localport自アプリケーションのポート番号設定取得
Protocol1 - sckUDPProtocolを設定取得
RemoteHost相手コンピュータ名またはIPアドレス設定取得
RemoteHostIP相手コンピュータのIPアドレス取得
RemotePort相手アプリケーションのポート番号設定取得
SocketHandleソケットハンドル取得
State接続状態取得
メソッド
Bind受信するソケットを特定のポートに割り当てます
GetData相手アプリケーションの送信データを取得します
SendData相手アプリケーションにデータを送信します
イベント
DataArrivalデータが届きました
Errorエラーが発生しました

UDPの場合は、TCPと異なりクライアントとサーバーという考え方はありません。UDPを使ったアプリケーション層プロトコルで始めてクライアントとサーバーという区別が生まれます。UDPでは、データ送信側とデータ受信側という関係になります( リスト3リスト4および 図3図4))。

この一定範囲にデータを送信する特性を使って、UDPプログラムのサンプルとして、ファイル検索のプロトコルを作ってみました。
このプロトコルは、クライアント側から20001番のポートで一定範囲内にファイル名を送信して、サーバーからの結果の送信を待ちます。サーバーは20001番で検索依頼を待っていて、クライアント側からのファイル名がディスク上に存在すると自分の名前とファイル名を送信します(図5)。
なお、クライアントからは、サブネットを意識したIPアドレスを指定し、サーバー側からは、クライアントのIPアドレスを指定してデータを送信しています。

TCPを使ったn階層C/Sシステムを作る

このように、Internet対応ActiveXコントロールは、特別な設定などをしなくても、手軽に複数のプログラムがネットワークを通して情報をやり取りできることがおわかりいただけたでしょう。最後に応用編として、AccessのMDBを使った例をご紹介します。もちろん、サーバー側DBは、MDBではなく、SQL ServerやOracleでも構いませし、サーバーとは異なるマシンにDBがあっても構いません(図1)。

この独自プロトコルの基本的な流れは、TCPコネクションが確立したら、クライアント側から各種依頼データを送信し、サーバ側で処理した結果をクライアントに戻します。いわゆるビジネスロジックとDBに対するトランザクション処理をサーバー側が担当しています(図7)。つまり、サーバー側がクライアントから依頼された情報がどこにあるか掴んでいれば、利用者は、すべて同一のインターフェースでありとあらゆる情報を検索してくることができます。そして、クライアント側に情報にあわせたPlug-Inを付けておけば、元の情報に近い形で検索結果を見ることができます。もちろん、このPlug-In自体をActiveX Documentsとしてサーバー側がクライアントに提供するのも良い案かもしれません。

無理矢理ODBCやDCOMなどのマイクロソフトの独自技術で統一した環境にしてしまうよりも、よっぽど各データベースとそこに蓄積された情報にマッチしたシステムが構築できるハズです。ただし、それなりに設計やノウハウは必要になるでしょう。

図9 TCPを使ったn階層C/Sシステムの概要

Internet対応ActiveXコントロールを使う上での注意点

Internet系ActiveXコントロールを開発に使う場合に技術面以外にも注意する点があります。
それは、Internet Transferコントロールがマイクロソフトの製品であるのにも関わらず、 Winsockコントロールが他のコントロールと同じように、ソフトメーカーのOEM(WinsockコントロールのOEM元はネットマネージ)である点です。 Visual Basic 5.0 β版を元にして執筆しているので、製品版での扱いが不明ですが、他のOEM提供のコントロールと同様に気に入ったら、ネットマネージの製品版を購入した方がよいかもしれません。マイクロソフトには、Internet Explorer、Internet NewsそしてInternet Mailがあるので、Visual Basic 5.0に添付してあるものは、ネットマネージの該当製品からそれらが提供している機能を除いたサブセット版なのかもしれません。

現に、ICPβは、まるごとネットマネージのNEWT-SDKに吸収された形になっています。ですから、NEWT-SDKには、Winsockの他にFTP、HTTP、POP3、SMTP、NNTPおよびHTMLの各コントロールが含まれています。そして、NEWT-SDKの正当な流れを汲んでいるBorlandのISP(Internet Solution Pack) では、ICPβと同じOCX名で、NetManage FTP Clientのようにコントロール名が表示されます。
しかし、Visual Basic 5.0の添付版ではなく、NEWT-SDKを採用するのも注意が必要です。NEWT-SDKは、再配布無料ではなく、ランタイム版(NEWT-DLL)を必要数分購入する必要があります(これは、ネットマネージジャパンにICPβ再配布条件を問い合わせた結果の回答(97年1月9日付け)に明記されていました)。

つまり、Internet対応ActiveXコントロールは、今までのMSComm、MSChart、 DbGridなどのように、同じようなライセンス体系の製品版を購入すればよいという訳ではありません。これは、受託開発をする上で非常にまずい状況ではないでしょうか。製品版ではこのあたりの再配布の問題がクリアされていることをマイクロソフトおよびネットマネージに期待します。

Visual Basic 開発者の手引き | Visual Basicコースホームページ
int21 ホームページ | PCDN ホームページ



Copyright (c) 1997 Toshikazu Fukuoka All Rights Reserved.
For questions or comments, please send mail to: pcdn@int21.co.jp