特集

.NETネットワーク・プログラミング入門

―― .NETで実装する簡易ファイル交換ソフト ――

高木 健一
http://www.woodensoldier.info/
2004/12/18
Page1 Page2 Page3 Page4

 現在、コンピュータはネットワークを介して接続され、さまざまな処理を複数のコンピュータにまたがって行うことができるようになっている。インターネットの普及が、コンピュータのネットワーク化を促進し、World Wide Webや電子メールなどはすでに日常生活になくてはならないものとなった。

 本稿では、このようなネットワークの基礎技術であるTCP/IPについて説明し、サンプルとして簡易ファイル交換プログラムを作成してみる。記事の構成は以下のようになっている。

1. ネットワーク・プログラミングの概要
 1.1. ネットワークの基礎「TCP/IPプロトコル」とは
 1.2. TCP/IP通信を行うためのソケット・インターフェイス
 1.3. ソケット以外の通信手段

2. .NETにおけるソケット通信の技術
 2.1. ソケット通信を実装するためのクラス群
 2.2. TcpClientとTcpListenerの利用と通信イメージ
 2.3. ストリーム

3. .NETにおける通信プログラムの実装
 3.1. 簡易ファイル交換プログラムの作成
 3.2. 簡易ファイル交換ソフトの仕組み
 3.3. サンプル・プログラムの解説

1. ネットワーク・プログラミングの概要

 インターネットにつながっているコンピュータのOSには、Windows、UNIX、Linux、Macintoshなど、いろいろな種類がある。そのほかにもインターネット接続ができる携帯電話やPDA、最近ではIP電話などもある。これらさまざまな種類のコンピュータがお互いに通信をするためには共通のルールが必要である。その共通ルールの基礎に当たる部分が「TCP/IP」というプロトコルである。プロトコルとはコンピュータ同士がお互いに話をするための手順(人間でいえば言葉)である。

 インターネットの普及以前は標準のプロトコルはなく、通信手順はメーカーごと、OSごとに異なっていた。例えばNovell NetwareではIPX、MS-DOSではNetBEUIといった具合である。しかし、インターネットの登場によって、1つの標準プロトコルが必要となった。インターネットの世界で最も使われていたUNIXの標準プロトコルであったTCP/IPがインターネットに対応するように改良され、インターネットの標準のプロトコルとなった。現在ではIETF(Internet Engineering Task Force)によってインターネット標準のプロトコルとして策定されている。

 インターネットに接続するためにほとんどのコンピュータがこのTCP/IP通信に対応している。さまざまな種類のコンピュータがインターネットという1つのネットワーク上にTCP/IPという標準のプロトコルを介して接続されるようになったのである。

1.1. ネットワークの基礎「TCP/IPプロトコル」とは

 TCP/IPについてもう少し詳しく見てみよう。TCP/IPとまとめて呼ぶことが多いが、TCP(Transmission Control Protocol)とIP(Internet Protocol)はそれぞれ違った役割を果たすプロトコルである。OSI階層モデルでいうと、TCPがトランスポート層、IPがネットワーク層に当たる。IPプロトコルは、どのコンピュータにデータを送るかを指定し、TCPプロトコルはIPプロトコル上でデータを正しく送るためのエラー訂正や、必要に応じてデータの再送などを行う。

 相手先を指定するのがIPアドレスであり、原則として同じネットワーク・セグメント上には同一のIPアドレスがあってはならない。IPアドレスは「211.18.3.1」というふうに、0から255までの数字を4つ並べ、それぞれの間をドットで区切って表記する。

 TCP/IPという標準のプロトコルを使用することで、「指定した相手にデータを正しく届ける」という部分が処理され、ネットワーク・プログラミングをする開発者は「どのようなデータをどのような意味を持たせて送信するか」ということに集中できるのである。この「どのようなデータを送るのか」という部分がアプリケーション層、プレゼンテーション層、セッション層などと呼ばれる上位の階層に当たる。

OSI7層モデル
TCP/IPはOSI階層モデルのネットワーク層とトランスポート層をカバーしている。

 TCP/IPより下位の層であるデータリンク層と物理層は、ルータやスイッチング・ハブなどいわゆるネットワーク機器によってサポートされている。LAN構築などにおいては、どのベンダのネットワーク機器を買ってきても使えるというのはこの層の標準化のおかげである。

 このように各階層で標準を決めることによって、異なったプラットフォーム、異なったアプリケーション間で、ネットワーク通信が容易にできるようになるのである。TCP/IPはその重要な標準の1つということになる。

1.2. TCP/IP通信を行うためのソケット・インターフェイス

 TCP/IPという標準プロトコルを利用すると、異なるプラットフォーム間でも簡単に通信を実現できることを説明した。ところが実際に開発するとなると、TCP/IPの規定にそって通信手順を細かく実装しなくてはならない。この手間を省き、ネットワーク・プログラミングをより簡単に実現できるようにと開発されたのが「ソケット・インターフェイス」である。BSD(Berkeley Software Distribution) UNIXで初めて実装されたので「Berkeleyソケット」と呼ばれることも多い。Windowsでは「WinSock」という名前でOSに実装されている。

 ソケット・インターフェイスはネットワーク・プログラミングをするためのAPIであり、これによって開発者はTCP/IPなどの低レベルなプロトコルの詳細を気にすることなく、より簡便にまとめられたソケット・インターフェイスを使ってプログラムを開発できるようになった。

 ソケットではIPアドレスとポート番号のセットを指定して、どのコンピュータのどのアプリケーションと通信するかを特定する。ポート番号を利用することによって、1つのIPアドレスを持ったコンピュータ上の異なるネットワーク・アプリケーションを同時に実行することができるようになる。例えば以下の図のようにWebサーバとメール・サーバが1台のサーバ上で動いていても、ポート80にアクセスしてくればWeb、ポート25に接続してくればSMTPメール送信だと識別できる。

IPアドレスとポートを使ったソケット通信
IPアドレスとポート番号の組み合わせで通信先のアプリケーションを特定する。

 サーバ・アプリケーションとクライアント・アプリケーションは、このようにして作成したソケットを通じて、データを送受信できる。

 .NETではソケット通信を実現するため、Socketクラス(System.Net.Sockets名前空間)が用意されている。本稿では、このSocketクラスを利用することで、ソケット・インターフェイスを利用したネットワーク・アプリケーションの開発を行う。

1.3. ソケット以外の通信手段

 .NETでネットワーク・プログラミングを行うには、ソケットを利用する方法のほかに.NET リモート処理(.NET Remoting)とXML Webサービスという選択肢がある。ソケットを利用したプログラミングの説明に入る前に、それぞれの方法の特徴について見てみよう。

ソケット通信 .NETリモート処理 Webサービス
通信方法 データ・レベル メソッド・レベル メソッド・レベル
ステート管理 ステートフル ステートフル/ステートレス ステートレス
通信プラットフォーム ソケット・サーバ&クライアント .NETリモート処理(.NET Remoting)オブジェクト同士 Webサービス・サーバ&クライアント
インターオペラビリティ 異なるプラットフォーム間の通信が可能 .NETの環境内のみ 異なったプラットフォーム間の通信が可能
型の扱い なし 広範囲 XSDで定義される範囲内
適切な用途 ・相互プラットフォーム間の通信(例:WindowsとUNIX)
・既存のソケット・ベース・プロトコルを利用(FTPやTelnetなど)
・.NETオブジェクト同士の通信
・通信のステート管理が必要な場合
・SOAを実現する
・将来に備えた分散アプリケーション環境の構築
.NETネットワーク・プログラミング・テクノロジ比較
.NETでのネットワーク・プログラミングには主に3つの方法がある。

 .NETリモート処理(.NET Remoting)はネットワーク越しに.NETのオブジェクトにアクセスするための技術である。認証や通信の暗号化といったセキュリティ機能も.NETリモート処理のフレームワークの中で簡単に利用できる。分散コンピューティング環境で、オブジェクトを相互に頻繁にやりとりするような場合には最適な方法であろう。注意点としては、あくまで.NETの世界の中での通信となり、Javaやほかのプラットフォームとの通信は原則として考慮されていないことである。

 Webサービスは、SOAを実現できる通信手段である。.NETには強力なWebサービスの実装環境が用意されており、Webサービスを使用したネットワーク・プログラミングが簡単に行える。標準化も進んでいて、異なったプラットフォーム間での通信も行うことができるようになってきている。アプリケーション間のやり取りを、特定のプログラミング言語やプラットフォームによる制約条件から解放できるので、変化に強いネットワーク・アプリケーションを作成できる。Webサービスを利用するにはサーバ環境などをセットアップしなくてはいけないが、作成するネットワーク・アプリケーションが将来にわたって進化し保守していく必要がある場合には、望ましい選択肢となるだろう。

 これらの方法に比べると、ソケットを利用した通信はより低レベルでのネットワーク・プログラミングとなる。ソケットでの通信はシーケンシャルなバイト・データの流れになるので、データの意味や区切りは各アプリケーションで設計を行う必要がある。前述したOSIの7層モデルでいえば、TCP/IPのさらに上の階層であるアプリケーション層を、開発者が実装する必要があるということだ。現在インターネット上で標準的に使用されているFTP、HTTP、SMTP、POPなどは、そのように実装されて広く使用されているアプリケーション層のプロトコルである。これらのプロトコルはソケット・ベースであり、ソケットを用いてプログラミングすれば通信が可能である。

 .NET上で実際にネットワーク・プログラミングをする際には、この3つの通信手段の中からどの方法を使うのが最適かを検討する必要がある。本稿では最もプリミティブなソケットを利用したプログラミングを紹介していく。

 

 INDEX
  [特集] .NETネットワーク・プログラミング入門
  1.ネットワーク・プログラミングの概要
    2..NETにおけるソケット通信の技術
    3.簡易ファイル交換プログラムの仕組み
    4..NETにおけるTCP/IP通信処理の実装
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間