Updated 1997/07/03
By 富士通SSL)福岡寿和
Internet対応ActiveXコントロールがやってきた
基本中の基本−プロトコル−を知ろう
IPプロトコルの概要
TCPプロトコルの概要
Winsockコントロール(TCP)の使い方
UDPプロトコルの概要
UDP Winsockコントロールの使い方
TCPを使ったn階層C/Sシステムを作る
Internet対応ActiveXコントロールと聞いて、ICPβ版(Internet Control Packβ版)を思い浮かべる人も多いかもしれません。マイクロソフトは、ICPβのWWWでの配布を終了したときに「次期Visual Basicでは、ICPβよりも高性能のActiveXコントロールを提供する」とアナウンスをしたので、Visual Basic 5.0の発売を待っていた人も多いでしょう。マイクロソフトはVisual Basic 5.0で、表1のコントロールをICPの代わりに添付してきました。
| コントロール | サポートするプロトコル |
|---|---|
| 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のコントロールではありません。
| 階層 | プロトコル | 役目 |
|---|---|---|
| アプリケーション | HTTP、HTTPS、 FTP、 Gopherなど | Internet上の各種サービスを提供○○サーバーの○○に相当 |
| トランスポート | TCP、UDP | 相手アプリケーションを特定する |
| インターネット | IPなど | 相手コンピュータを特定するために世界レベルのアドレス方式を提供 |
| ネットワーク | Ethernet、 PPPなど | 通信回線に流すデータ形式を提供10Base-Tなどの通信回線 |
そのためには、まず、TCPプロトコルとUDPプロトコル、更にその下層にあたるIPプロトコルについて知っておく必要があります。
TCPは、0〜65、535のポート番号で相手先を特定します(相手コンピュータの特定は、IPがIPアドレスで行います)。つまり、TCPを使うクライアントアプリケーションは、接続したいサーバーアプリケーションに対応したポート番号を指定して接続要求を行います。SMTPやPOP3などの標準的なサーバーアプリケーションには、0〜1、023までのポート番号が予約されています(表3)。
| No | アプリケーション | |
|---|---|---|
| 20 | FTP(Data) | TCP |
| 21 | FTP | TCP |
| 23 | TELNET | TCP |
| 25 | SMTP | TCP |
| 53 | DNS | TCP/UDP |
| 70 | gopher | TCP |
| 80 | WWW | TCP |
| 119 | NNTP | TCP |
| 161 | SNMP | UDP |
| 162 | ||
| 513 | rlogin | TCP |
したがって、TCPを使って独自プロトコルを作る場合は、1、024以上の空いているポート番号を使います。ポート番号を決定したら(このポート番号も独自プロトコルの仕様になります)、サーバー側にその値を登録します。
サーバーがWindows NTであれば、winnt\system32\drivers\etc\serviceを修正します。Windows 95のときは、windows\serviceを修正します。
Windowsでは、このファイルを修正しなくてもサーバーアプリケーションが動作するようですが、他とポート番号が重複しないように、業務用のサーバーアプリケーションを作った場合は、必ず修正してください。
| プロパティ | ||||
|---|---|---|---|---|
| BytesReceive | 受信バッファ内にあるデータサイズ | ― | 取得 | |
| LocalHostName | 自コンピュータ名 | ― | 取得 | |
| LocalIP | 自コンピュータのIPアドレス | ― | 取得 | |
| Localport | 自アプリケーションのポート番号 | 設定 | 取得 | |
| Protocol | 0 - sckTCProtocolを設定 | ― | 取得 | RemoteHost | 相手コンピュータ名またはIPアドレス | 設定 | 取得 |
| RemoteHostIP | 相手コンピュータのIPアドレス | ― | 取得 | |
| RemotePort | 相手アプリケーションのポート番号 | 設定 | 取得 | |
| SocketHandle | ソケットハンドル | ― | 取得 | |
| State | 接続状態 | ― | 取得 | |
| 定数 | 値 | 内容 | ||
| sckClosed | 0 | 閉じてます | ||
| sckOpen | 1 | 開いてます | ||
| sckListening | 2 | 接続要求を待っています | ||
| sckConnectionPending | 3 | 接続がペンディング状態です | ||
| sckResolvingHost | 4 | 相手コンピュータ名取得中 | ||
| sckHostResolved | 5 | 相手コンピュータ名の取得完了 | ||
| sckConnecting | 6 | 接続処置中です | ||
| sckConnected | 7 | 接続が完了しました | ||
| sckClosing | 8 | 相手が接続を閉じようとしています | ||
| sckError | 9 | エラー | ||
| メソッド | ||||
| Accept | 相手アプリケーションからの接続要求を受け付けます | |||
| Bind | Listenするソケットを特定のポートに割り当てます | |||
| 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で定義されています。
| プロパティ | ||||
|---|---|---|---|---|
| LocalHostName | 自コンピュータ名 | ― | 取得 | |
| LocalIP | 自コンピュータのIPアドレス | ― | 取得 | |
| Localport | 自アプリケーションのポート番号 | 設定 | 取得 | |
| Protocol | 1 - 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、6)。
なお、クライアントからは、サブネットを意識したIPアドレスを指定し、サーバー側からは、クライアントのIPアドレスを指定してデータを送信しています。
この独自プロトコルの基本的な流れは、TCPコネクションが確立したら、クライアント側から各種依頼データを送信し、サーバ側で処理した結果をクライアントに戻します。いわゆるビジネスロジックとDBに対するトランザクション処理をサーバー側が担当しています(図7、8)。つまり、サーバー側がクライアントから依頼された情報がどこにあるか掴んでいれば、利用者は、すべて同一のインターフェースでありとあらゆる情報を検索してくることができます。そして、クライアント側に情報にあわせたPlug-Inを付けておけば、元の情報に近い形で検索結果を見ることができます。もちろん、このPlug-In自体をActiveX Documentsとしてサーバー側がクライアントに提供するのも良い案かもしれません。
無理矢理ODBCやDCOMなどのマイクロソフトの独自技術で統一した環境にしてしまうよりも、よっぽど各データベースとそこに蓄積された情報にマッチしたシステムが構築できるハズです。ただし、それなりに設計やノウハウは必要になるでしょう。
図9 TCPを使ったn階層C/Sシステムの概要
現に、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 ホームページ