Socketクラス

す!
せま
見
ド
全部
メソッ
る
繋が
ダイアモンドアプリコット電話研究所
11回
山崎 はるか
第
YAMAZAKI, Haruka
http://www.nda.co.jp/
Socketクラス
.NET Frameworkを 使 っ た ネ ッ ト
ワークプログラミング(すなわちマ
Socketクラス
∼パケットモニターの作り方
ネージド)において、アプリケーショ
2)
。gethostbyaddressなどの名前解決
ンが、どこまでシステムに接近/深堀
はDnsクラス、データ構造体はIPHost
りできるだろうか。その最深部こそが
EntryやIPEndPointに引き継がれるな
Socketクラスである(図1)
。
ど、役割ごとに再編成されている(わ
Socketクラスは、WinSock(コラム
参照)の主要部分を.NET Framework
Level
1
から使えるようにしたクラスである。
2
3
4
5
Technology Tools
Visual Basic
Visual C#
Visual C++
SQL Server
Oracle
Access
.NET Frameworkにおいて、Socket
かりやすくなった)
。
かつてVC++、VBのDeclareで Win
Sock APIを直接コールすることが常識
だった時期もある。しかし各種コント
クラスは、connectなど WinSockの通
ロールプログラミングの時代をはさみ、
信関数部分を受け持っている(表1・
いまやネットワークプログラミングの
WinSockってなに?
WinSockとは、WindowsでTCP/IPアプ
リケーションを作るための API セットであ
り、UNIXのSocketライブラリをベースに
複数のベンダー(メーカー)が 参加して定め
たものである。
当初は TCP/IP 用であったが、現在の
WinSock 2.xはIPXなど他のプロトコルも使
えるようになった。
Windows 95では、標準でWinSock 1.1
が 実装され、後付けDLLでWinSock 2.xを
提供。Windows 98 以降では標準で Win
Sock 2.2が実装されている。
ASP.NET
Other:
Visual Studio .NET 2003
Samples
この記事で取り上げたソースコードおよび
サンプルプログラムは、
http://www.shoeisha.com/mag/windev/
からダウンロード可能です。
112 Windows Developer Magazine
WinSock 2.2ってなに?
WinSockは1.0も2.0も「仕様」のことで
おいても「WinSock」は仕様名で、それを
あり、実際にDLLとしてリリースされている 「Winsock」と書くときはWindowsのAPI
バージョンはそれぞれ1.1や2.2である。な
名/コントロール名を指す……といったわけ
ので「APIリファレンス」などのように“仕
のわからない風習/混乱もあったりする。
様”を書いたものは「WinSock 2.0解説」
しかし、ありがたいことに、.NET Frame
となるが、関数や API の適用バージョンは
workになってから「SocketはSocketクラ
1.1や2.2必須などと書いてあったりする。
ス」と定まった。このおかげで、いまは余分
この時点でもややこしいのだが、用語面に
なことまで覚えなくて済んでいる。
Socketクラス∼パケットモニターの作り方
図1:.NET Frameworkの範囲
HttpWeb
Request
クラス
FileWeb
Response
クラス
FileWeb
Request
クラス
HttpWeb
Response
クラス
WebClient
クラス
Web
Request
クラス
IPEnd
Point
System.Net
IPHost
Entry
Dns
クラス
TcpClientクラス
TcpListenerクラス
UdpClientクラス
.NET Framework
System.Net.Sockets
Socketクラス
WinSock2.0(∼2.2)
アンマネージド
(OS深部)
Tranceport Device Layer
RSVP
Afd.dll
Traffic.dll
デバイスドライバ
Tcpip.sys
VS6.0
C/C++
Msgcp.sys
Ndis.sys
イーサネット
カード
主流は「Socketクラス」以上の上位構
Pingクライアントや Tracerouteクライ
主役クラスでないとはいっても、重
造にほぼシフトしたといえる。
アントのようにICMPなど「他のプロト
要な存在であることに代わりはないの
コルを用いる場合」などがそれである。
である。
さらにいうなら、TcpClientクラス、
TcpListnerクラスの存在により、Soc
また、Raw(ナマ)パケットをまるご
ket クラスすらも、主役にはあらず、
と監視/表示する「パケットモニター
もっぱらC++/UNIXプログラマのため
の構築」には、IOControlメソッドが不
の一時的な代替クラスとして用いられ
可欠である。
ているというのが現実である。この時
ほかにも、特別な非同期接続 ――
代、ソケットを操作できるからといっ
UdpClientクラスのように、現状ではタ
て、それが偉いというわけではない。
イムアウトが指定できないメソッドを、
しかし、Socketクラスを用いないと
実装で きないものが ある。たとえば
速習!
Socketクラス実践
Socketクラスで TCPクライアントを
作ってみよう。
各局面で用いるメソッドは、図2の
代替したいときなど ―― にもSocketク
とおり
(UDPの場合は図3)
。ぱっと見で
ラスは活躍する。
は、TcpClientクラスによく似ているが、
2006 March 113