連載:世界のWebサービス
第7回 Code Red感染サーバの国籍を探る

2.サンプル・プログラムNSLookupClient

田口 景介
2001/08/10

 以下に今回作成したサンプル・プログラムのソース・コードを示す。これはVisual Studio .NETベータ2を使用して作成したものだ。途中のコメントには自動生成されたものも含まれている。#region(55行目)や#endregion(148行目)も自動的に挿入されるものである。

 プログラムの大部分はラベルやテキストボックスなどのユーザーインターフェイスに関するものだ。実際にWebサービスを呼び出している個所は、検索ボタンが押されたときに実行されるbutton1_Clickメソッドである(159〜175行目)。Webサービスの本体であるtranslateメソッドはInternetAddress型のオブジェクトを返す。これには、文字列型であるIPとHostnameがメンバとして含まれている。

 1: using System;
 2: using System.Drawing;
 3: using System.Collections;
 4: using System.ComponentModel;
 5: using System.Windows.Forms;
 6: using System.Data;
 7:
 8: namespace NSLookupClient
 9: {
10:   /// <summary>
11:   /// Form1 の概要の説明です。
12:   /// </summary>
13:   public class Form1 : System.Windows.Forms.Form
14:   {
15:     private System.Windows.Forms.Button ButtonResolv;
16:     private System.Windows.Forms.GroupBox groupBox1;
17:     private System.Windows.Forms.TextBox IP;
18:     private System.Windows.Forms.TextBox Hostname;
19:     private System.Windows.Forms.Label label1;
20:     private System.Windows.Forms.TextBox textRequest;
21:     private System.Windows.Forms.Label label2;
22:     private System.Windows.Forms.Label label3;
23:     /// <summary>
24:     /// 必要なデザイナ変数です。
25:     /// </summary>
26:     private System.ComponentModel.Container components = null;
27:
28:     public Form1()
29:     {
30:       //
31:       // Windows フォーム デザイナ サポートに必要です。
32:       //
33:       InitializeComponent();
34:
35:       //
36:       // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
37:       //
38:     }
39:
40:     /// <summary>
41:     /// 使用されているリソースに後処理を実行します。
42:     /// </summary>
43:     protected override void Dispose( bool disposing )
44:     {
45:       if( disposing )
46:       {
47:         if (components != null)
48:         {
49:           components.Dispose();
50:         }
51:       }
52:       base.Dispose( disposing );
53:     }
54:
55:     #region Windows Form Designer generated code
56:     /// <summary>
57:     /// デザイナ サポートに必要です。このメソッドの内容を
58:     /// コード エディタで変更しないでください。
59:     /// </summary>
60:     private void InitializeComponent()
61:     {
62:       this.ButtonResolv = new System.Windows.Forms.Button();
63:       this.groupBox1 = new System.Windows.Forms.GroupBox();
64:       this.IP = new System.Windows.Forms.TextBox();
65:       this.Hostname = new System.Windows.Forms.TextBox();
66:       this.label1 = new System.Windows.Forms.Label();
67:       this.textRequest = new System.Windows.Forms.TextBox();
68:       this.label2 = new System.Windows.Forms.Label();
69:       this.label3 = new System.Windows.Forms.Label();
70:       this.groupBox1.SuspendLayout();
71:       this.SuspendLayout();
72:
73:       // ButtonResolv
74:       this.ButtonResolv.Location = new System.Drawing.Point(296, 32);
75:       this.ButtonResolv.Name = "ButtonResolv";
76:       this.ButtonResolv.TabIndex = 0;
77:       this.ButtonResolv.Text = "検索";
78:       this.ButtonResolv.Click += new System.EventHandler(this.button1_Click);
79:
80:       // groupBox1
81:       this.groupBox1.Controls.AddRange(new System.Windows.Forms.Control[] {
82:           this.label3, this.label2, this.IP, this.Hostname});
83:
84:       this.groupBox1.Location = new System.Drawing.Point(16, 64);
85:       this.groupBox1.Name = "groupBox1";
86:       this.groupBox1.Size = new System.Drawing.Size(360, 104);
87:       this.groupBox1.TabIndex = 3;
88:       this.groupBox1.TabStop = false;
89:       this.groupBox1.Text = "検索結果";
90:
91:       // IP
92:       this.IP.Location = new System.Drawing.Point(104, 56);
93:       this.IP.Name = "IP";
94:       this.IP.ReadOnly = true;
95:       this.IP.Size = new System.Drawing.Size(240, 19);
96:       this.IP.TabIndex = 1;
97:       this.IP.Text = "";
98:       this.IP.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
99:
100:       // Hostname
101:       this.Hostname.Location = new System.Drawing.Point(104, 24);
102:       this.Hostname.Name = "Hostname";
103:       this.Hostname.ReadOnly = true;
104:       this.Hostname.Size = new System.Drawing.Size(240, 19);
105:       this.Hostname.TabIndex = 2;
106:       this.Hostname.Text = "";
107:       this.Hostname.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
108:
109:       // label1
110:       this.label1.Location = new System.Drawing.Point(8, 8);
111:       this.label1.Name = "label1";
112:       this.label1.Size = new System.Drawing.Size(112, 23);
113:       this.label1.TabIndex = 4;
114:       this.label1.Text = "ホスト名 or IPアドレス";
115:
116:       // textRequest
117:       this.textRequest.Location = new System.Drawing.Point(24, 32);
118:       this.textRequest.Name = "textRequest";
119:       this.textRequest.Size = new System.Drawing.Size(256, 19);
120:       this.textRequest.TabIndex = 5;
121:       this.textRequest.Text = "";
122:
123:       // label2
124:       this.label2.Location = new System.Drawing.Point(16, 24);
125:       this.label2.Name = "label2";
126:       this.label2.Size = new System.Drawing.Size(64, 23);
127:       this.label2.TabIndex = 3;
128:       this.label2.Text = "ホスト名";
129:
130:       // label3
131:       this.label3.Location = new System.Drawing.Point(16, 56);
132:       this.label3.Name = "label3";
133:       this.label3.Size = new System.Drawing.Size(64, 23);
134:       this.label3.TabIndex = 4;
135:       this.label3.Text = "IPアドレス";
136:
137:       // Form1
138:       this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
139:       this.ClientSize = new System.Drawing.Size(392, 189);
140:       this.Controls.AddRange(new System.Windows.Forms.Control[] {
141:         this.textRequest, this.label1, this.ButtonResolv, this.groupBox1});
142:       this.Name = "Form1";
143:       this.Text = "NSLookup";
144:       this.groupBox1.ResumeLayout(false);
145:       this.ResumeLayout(false);
146:
147:     }
148:     #endregion
149:
150:     /// <summary>
151:     /// アプリケーションのメイン エントリ ポイントです。
152:     /// </summary>
153:     [STAThread]
154:     static void Main()
155:     {
156:       Application.Run(new Form1());
157:     }
158:
159:     private void button1_Click(object sender, System.EventArgs e)
160:     {
161:       try
162:       {
163:         NSLookup nsl = new NSLookup();
164:         InternetAddress ia = nsl.translate(textRequest.Text);
165:         IP.Text = ia.IP;
166:         Hostname.Text = ia.Hostname;
167:       }
168:       catch
169:       {
170:         IP.Text = "見つかりませんでした";
171:         Hostname.Text = textRequest.Text;
172:       }
173:     }
174:   }
175: }
NSLookupClient.csのソース・コード
このプログラムのコンパイルおよび実行には.NET Framework SDKベータ2あるいはVisual Studio .NETベータ2が必要です。

 こうして作ったサンプル・プログラムを使ってさっそくCode Redの感染システムを調べてみたところ、米国、韓国、中国が3強で、そのほかにも英国、フランス、ドイツ、オーストラリア、オーストリア、タイ、香港等、そしてもちろん日本からのアクセスが行われていることが確認できた。結局出た結論は「世界中」。

 実は.NET Frameworkのクラス・ライブラリには、ホスト名とIPアドレスの相互変換を行うDNSクラス(System.Net.DNS)が含まれている。そのため今回紹介したWebサービスを.NET Framework環境から呼び出すことは、先にも述べたようにあまり意味がない。今回の話のポイントはむしろ、古いWSDLを持ったWebサービスを呼び出すところにある。

 ところで報道によれば、8月に入ってからの6日間で、全世界でおよそ36万台のシステムがCode Redに感染したとされている。どの程度の割合でIISサイトが感染しているかは分からないが、相当にIISを採用するサイトが増えていると感じられる数字だ。そして、これはNetcraftによるマーケットシェア調査(http://www.netcraft.com/survey/)でも、はっきりと数字に表れている。何と、2001年6月には20.39%だったIISのシェアが、翌2001年7月には一気に25.88%にまで伸びているのだ。その要因として考えられるのは、やはりWindows 2000 SP2のリリースであろう。しかし、そのSP2を適用したシステムでもCode Redを阻むことはできなかった。今後の推移が気になるところだ。 End of Article

 

 INDEX
  [連載]世界のWebサービス―― 究極のWebサービスを求めて ――
  第7回 Code Red感染サーバの国籍を探る
    1.NSLookup Webサービス
  2.サンプル・プログラムNSLookupClient
 
「世界のWebサービス」


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 記事ランキング

本日 月間