印刷

Similar documents
LogisticaTRUCKServer-Ⅱ距離計算サーバ/Active-Xコントロール/クライアント 概略   

ファイル操作-バイナリファイル

// このクラスの有効期間中の各呼び出しに使用される キャッシュされた Socket オブジェクト Socket socket = null; // 非同期処理が完了したことを通知するために信号を送るオブジェクト static ManualResetEvent clientdone = new Ma

12.1 インターネットアドレス インターネットアドレス インターネットアドレス 32 ビットの長さを持つインターネットに接続されたマシンを識別するのに使う インターネットアドレスは ピリオドで区切られたトークンの並びで表現されることもある インターネットアドレス

チャットアプリ

ファイル操作

データアダプタ概要

プロセス間通信

ICONファイルフォーマット

(Microsoft PowerPoint - \223\306\217KJava\221\346\202R\224\305.ppt)

構造体

ファイル操作-インターネットキャッシュ

プラグイン

ハッシュテーブル

VB.NET解説

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

正規表現応用

2. ネットワークアプリケーションと TCP/IP 2.1. クライアント / サーバモデル TCP/IP プロトコルに従うネットワークアプリケーションの典型的モデルは, クライアント / サーバモデルである. クライアント / サーバモデルでは, クライアントからの要求に対してサーバがサービスを提

ADO.NETのアーキテクチャ

ファイル監視

NetLec17TCPIP1.ppt

PowerPoint Presentation

mySQLの利用


Visual Basic 資料 電脳梁山泊烏賊塾 コレクション初期化子 コレクション初期化子 初めに.NET 版の Visual Basic では 其れ迄の Visual Basic 6.0 とは異なり 下記の例の様に変数宣言の構文に 初期値を代入する式が書ける様に成った 其の際 1 の様に単一の値

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 関数とメソッド 関数とメソッド Python には関数 (function) とメソッド (method) が有る モジュール内に def で定義されて居る物が関数 クラス内に def で定義されて居る物がメソッドに成る ( 正確にはクラスが

MISAO with WPF

TFTP serverの実装

チャットプログラム

2.5 トランスポート層 147

VB 資料 電脳梁山泊烏賊塾 音声認識 System.Speech の利用 System.Speech に依るディクテーション ( 音声を文字列化 ).NetFramework3.0 以上 (Visual Studio 2010 以降 ) では 標準で System.Speech が用意されて居るの

コードページ

正規表現詳細

PowerPoint Presentation

グラフィックス

ListViewコントロール

NotifyIconコントロール

Java知識テスト問題

第1回 ネットワークとは

Managed Firewall NATユースケース

Prog1_10th

情報通信の基礎

file:///C:/www/


ウィンドウ操作 応用

実験 6 通信基礎実験 1 目的 ネットワークを通じてデータ転送を行うことを体験的に学ぶために 本実験ではT CP/IPプロトコルを使い ワークステーション間で通信を行うクライアントサーバモデルのプログラムを作成する 2 解説 1 ネットワークとプロトコルネットワーク ( コンピュータネットワーク

TestDesign for Web

Oracle DatabaseとIPv6 Statement of Direction

Android Layout SDK プログラミング マニュアル

Microsoft Excel操作

VPN 接続の設定

LogisticaTRUCKServer-Ⅱ距離計算サーバ/Active-Xコントロール/クライアント 概略   

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

Microsoft PowerPoint ppt

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

スライド 1

IP L09( Tue) : Time-stamp: Tue 14:52 JST hig TCP/IP. IP,,,. ( ) L09 IP (2017) 1 / 28

アマチュア無線のデジタル通信

通信対戦プログラム

スライド 1

Javaプログラムの実行手順

チャットプログラム

基礎計算機演習 実習課題No6

Microsoft PowerPoint ppt [互換モード]

GUIプログラムⅣ

Oracle DatabaseとIPv6 Statement of Direction

Prog1_15th

Microsoft PowerPoint - ie ppt

VB実用Ⅲ⑩ フリーデータベースⅡ

とても使いやすい Boost の serialization

ファイル入出力Ⅰ

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

VB6互換のファイルの処理

パケットモニター (Wireshark) の使い方 第 1 版 1.Wireshark とは ネットワーク上 (LAN ケーブルに流れている ) のパケットを取得して その中の情報を画面に表示するソフトウェア (LAN アナライザーまたはパケットモニター ) の 1 つに Wiresh

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

CLUSTERPRO for Linux MySQL HowTo

LogisticaTRUCKServer-Ⅱ距離計算サーバ/Active-Xコントロール/クライアント 概略   



untitled

プログラミング基礎I(再)

Network Programming

55 7 Java C Java TCP/IP TCP/IP TCP TCP_RO.java import java.net.*; import java.io.*; public class TCP_RO { public static void main(string[] a

Microsoft PowerPoint - netprog_2015_07.ppt [互換モード]

IPv4

多言語ドメイン名の実装 mdnkit 石曽根信 ( 株 ) SRA 2001/12/04 日本語ドメイン名解説 / mdnkit 1 mdnkit 多言語ドメイン名を扱うためのツールキット 正規化 エンコード変換等を提供するライブラリとコマンド 既存アプリケーシ

インターネットVPN_IPoE_IPv6_fqdn

第 4 章ファイル共有 NFS の構成 NFS(Network File System) は ネットワーク上でファイル共有を提供する仕組みです 主に Linux-Linux 間や Linux-UNIX 間で使用されます NFS サーバーが公開 ( エクスポート ) したディレクトリを N

承 認

Java講座

21 章のお話

通信対戦プログラム

本資料について

JavaプログラミングⅠ

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 文字列 文字列リテラル プログラムの中で文字列を表す方法は幾つか有るが 基本的な方法は下記の 2 種で有る 対象と成る文字の集まりをダブルクオーテーション ( " ) で囲うか シングルクオーテーション ( ' ) で囲う PYTHON3 "

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

FW ファイルアップロード ダウンロード機能利用ガイド Version 年 9 月 21 日富士通株式会社 i All Right Reserved, Copyright FUJITSU LIMITED

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

R80.10_FireWall_Config_Guide_Rev1

Microsoft Word - Android_SQLite講座_画面800×1280

Transcription:

Socket クラス Socket クラスの利用 解説 Socket クラスには ネットワーク通信の為のメソッドとプロパティが豊富に用意されて居る Socket クラスを使用すると ProtocolType 列挙体で示されて居る各種の通信プロトコルを使い 同期や非同期でデータを転送出来る Socket クラスは.NET Framework での非同期メソッドの名前付け規則に従って居る 例えば 同期の Receive メソッドは非同期の BeginReceive メソッドと EndReceive メソッドに対応する 実行中に 1 つのスレッドしか必要無い場合に使用するメソッドを次に示す 此等のメソッドは同期操作モードでの使用を想定して居る TCP 等のコネクション指向のプロトコルを使用する場合 サーバーは Listen メソッドを使用して接続を待機する Accept メソッドは受信接続要求を処理して リモートホストとのデータ通信に使用出来る Socket を返す 此の返された Socket を使用して Send メソッドや Receive メソッドを呼び出す ローカル IP アドレスとポート番号を指定する場合は Listen メソッドの前に Bind メソッドを呼び出す 基に成るサービスプロバイダに依り空きポートが割り当てられる様にする場合は ポート番号に 0 を使用する 待機中のホストに接続する必要が有る場合は Connect メソッドを呼び出す データを送受信するには Send メソッドや Receive メソッドを呼び出す UDP 等のコネクションレスのプロトコルを使用して居る場合は 接続を待機する必要は無い ReceiveFrom メソッドを呼び出して 受信データグラムを受け取る データグラムをリモートホストに送信するには SendTo メソッドを使用する 実行中に個別のスレッドを使用して通信を処理する場合に使用するメソッドを次に示す 此等のメソッドは 非同期操作モードでの使用を想定して居る TCP 等のコネクション指向のプロトコルを使用する場合は Socket メソッド BeginConnect メソッド 及び EndConnect メソッドを使用して待機中のホストと通信する データの非同期的な送受信には BeginSend メソッドと EndSend メソッド 又は BeginReceive メソッドと EndReceive メソッドを使用する BeginAccept 及び EndAccept を使用すると 受信接続要求を処理出来る UDP 等のコネクションレスのプロトコルを使用して居る場合は BeginSendTo 及び EndSendTo を使用してデータグラムを送信する データグラムの受信には BeginReceiveFrom と EndReceiveFrom を使用する ソケット上で複数の非同期動作を実行する場合 各動作の実行は開始された順に完了するとは限らない データの送受信が完了したら Shutdown メソッドを使用して Socket を無効にする Shutdown を呼び出してから Close メソッドを呼び出して Socket に関連付けられて居る総てのリソースを解放する Socket クラスを使用すると SetSocketOption メソッドを使用して Socket を設定出来る 此等の設定を取得するには GetSocketOption メソッドを使用する -1-

比較的単純なアプリケーションを記述して居り 最高のパフォーマンスを必要と仕無い場合は TcpClient TcpListener 及び UdpClient を使用する事を検討すると良い 此等のクラスには Socket 通信を行う為のより単純で解り易いインターフェイスが用意されて居る Windows Mobile for Pocket PC Windows Mobile for Smartphone Windows CE プラットフォームでは 総てのデバイスのオペレーティングシステムで 総てのソケットオプションがサポートされて居る訳では無い 使用例 Socket クラスを使用して データを HTTP サーバーに送信し 応答を受信する方法を 次のコード例に示す 此の例は 総てのページを受信する迄 ブロックする Imports System Imports System.Text Imports System.IO Imports System.Net Imports System.Net.Sockets Imports Microsoft.VisualBasic Public Class GetSocket Private Shared Function ConnectSocket(server As String, port As Integer) As Socket Dim s As Socket = Nothing Dim hostentry As IPHostEntry = Nothing ' ホスト関連情報の取得 hostentry = Dns.GetHostEntry(server) ' アドレスリストよりサポートされて居るアドレスファミリーを取得 Dim address As IPAddress For Each address In hostentry.addresslist Dim endpoint As New IPEndPoint(address, port) Dim tempsocket As New Socket( _ endpoint.addressfamily, SocketType.Stream, ProtocolType.Tcp) tempsocket.connect(endpoint) If tempsocket.connected Then s = tempsocket Exit For End If Next address Return s End Function -2-

' 指定のサーバにホームページコンテンツを要求するジェネラルプロシージャ Private Shared Function SocketSendReceive(server As String, port As Integer) As String ' サーバに書き込む為の設定 Dim ascii As Encoding = Encoding.ASCII Dim request As String = "GET / HTTP/1.1" + ControlChars.Cr + ControlChars.Lf + "Host: " _ + server + ControlChars.Cr + ControlChars.Lf + "Connection: Close" + ControlChars.Cr _ + ControlChars.Lf + ControlChars.Cr + ControlChars.Lf Dim bytessent As [Byte]( ) = ascii.getbytes(request) Dim bytesreceived(255) As [Byte] ' ソケット接続の生成 Dim s As Socket = ConnectSocket(server, port) If s Is Nothing Then Return "Connection failed" End If ' サーバに要求の送信 s.send(bytessent, bytessent.length, 0) ' サーバのホームページコンテンツを受信 Dim bytes As Int32 ' 最初の 256 バイトの読込 Dim page as [String] = "Default HTML page on " + server + ":" _ + ControlChars.Cr + ControlChars.Lf ' ページ送信迄のブロック Do bytes = s.receive(bytesreceived, bytesreceived.length, 0) page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes) Loop While bytes > 0 Return page End Function ' C スタイルの main 関数へのデリゲートのエントリポイント Public Overloads Shared Sub Main( ) Main(System.Environment.GetCommandLineArgs()) End Sub Overloads Private Shared Sub Main(args() As String) Dim host As String Dim port As Integer = 80 If args.length = 1 Then ' 引数にサーバ名が指定されて居ない場合は 規定で現在のサーバを使用 host = Dns.GetHostName() Else -3-

host = args(1) End If Dim result As String = SocketSendReceive(host, port) Console.WriteLine(result) End Sub 'Main End Class using System; using System.Text; using System.IO; using System.Net; using System.Net.Sockets; public class GetSocket private static Socket ConnectSocket(string server, int port) Socket s = null; IPHostEntry hostentry = null; // ホスト関連情報の取得 hostentry = Dns.GetHostEntry(server); // アドレスリストよりサポートされて居るアドレスファミリーを取得 foreach(ipaddress address in hostentry.addresslist) IPEndPoint ipe = new IPEndPoint(address, port); Socket tempsocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp); tempsocket.connect(ipe); if(tempsocket.connected) s = tempsocket; break; else continue; return s; -4-

// 指定のサーバにホームページコンテンツを要求するジェネラルプロシージャ private static string SocketSendReceive(string server, int port) string request = "GET / HTTP/1.1 r nhost: " + server + " r nconnection: Close r n r n"; Byte[] bytessent = Encoding.ASCII.GetBytes(request); Byte[] bytesreceived = new Byte[256]; // ソケット接続の生成 Socket s = ConnectSocket(server, port); if (s == null) return ("Connection failed"); // サーバに要求の送信 s.send(bytessent, bytessent.length, 0); // サーバのホームページコンテンツを受信 int bytes = 0; string page = "Default HTML page on " + server + ": r n"; // ページ送信迄のブロック do bytes = s.receive(bytesreceived, bytesreceived.length, 0); page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes); while (bytes > 0); return page; public static void Main(string[] args) string host; int port = 80; if (args.length == 0) // 引数にサーバ名が指定されて居ない場合は 規定で現在のサーバを使用 host = Dns.GetHostName(); else host = args[0]; string result = SocketSendReceive(host, port); Console.WriteLine(result); -5-

ソケットを作成する方法 ソケットを使用してリモートデバイスと通信するには プロトコル情報とネットワークアドレス情報を使用して事前にソケットを初期化して置く必要が有る Socket クラスのコンストラクタには アドレスファミリ ソケットの種類 及び ソケットが接続を行う為に使用するプロトコルの種類を指定するパラメータが有る 使用例 インターネット等の TCP/IP ベースのネットワーク上で通信する為に使用出来るソケットの作成例を次に示す Dim s as New Socket(AddressFamily.InterNetwork, _ SocketType.Stream, ProtocolType.Tcp) Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); TCP の代わりに UDP を使用する場合は プロトコルの種類を 次の例の様に変更する Dim s as New Socket(AddressFamily.InterNetwork, _ SocketType.Dgram, ProtocolType.Udp) Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); AddressFamily 列挙体は Socket クラスがネットワークアドレスを解決する為に使用する標準のアドレスファミリを指定する 例えば AddressFamily.InterNetwork メンバは IP バージョン 4 アドレスファミリを指定する メンバ名 AppleTalk Atm Banyan Ccitt Chaos Cluster DataKit DataLink DecNet Ecma FireFox HyperChannel Ieee12844 ImpLink 説明 AppleTalk アドレスネイティブ ATM サービスアドレス Banyan アドレス X.25 等 CCITT プロトコルのアドレス MIT CHAOS プロトコルのアドレス Microsoft クラスタ製品のアドレス Datakit プロトコルのアドレスダイレクトデータリンクインターフェイスアドレス DECnet アドレス ECMA(European Computer Manufacturers Association) アドレス FireFox アドレス NSC Hyperchannel アドレス IEEE 1284.4 ワークグループアドレス ARPANET IMP アドレス -6-

InterNetwork InterNetworkV6 Ipx Irda Iso Lat Max NetBios NetworkDesigners NS Osi Pup Sna Unix Unknown Unspecified VoiceView IP version 4 のアドレス IP version 6 のアドレス IPX アドレス 又は SPX アドレス IrDA アドレス ISO プロトコルのアドレス LAT アドレス MAX アドレス NetBios アドレス Network Designers OSI ゲートウェイ対応プロトコルのアドレス Xerox NS プロトコルのアドレス ISO プロトコルのアドレス PUP プロトコルのアドレス IBM SNA アドレス Unix local to host アドレス未確認のアドレスファミリ指定のないアドレスファミリ VoiceView アドレス SocketType 列挙体は ソケットの種類を指定する 例えば SocketType.Stream メンバは データをフロー制御付きで送受信する場合に使用する標準のソケットを示す メンバ名説明 Dgram データグラムをサポートして居る 此れはコネクションレスで 固定 ( 通常は短い ) 最大長の 信頼性の無いメッセージで有る メッセージが失われるか複製されたり 正しい順序で受信されない可能性が有る Dgram 型の Socket はデータの送受信に先立って接続する必要が無く 複数のピアと通信出来る Dgram はデータグラムプロトコル (Udp) と InterNetworkAddressFamily を使用する Raw 基に成るトランスポートプロトコルへのアクセスをサポートする SocketTypeRaw を使用すると インターネットコントロールメッセージプロトコル (Icmp) やインターネットグループ管理プロトコル (Igmp) 等のプロトコルを使用して通信を行う事が出来る ユーザーのアプリケーションが送信時に完全な IP ヘッダーを提供する必要が有る 受信データグラムは IP ヘッダーとオプションを其の儘返す Rdm コネクションレスでメッセージ指向の 配信の信頼性が高いメッセージをサポートし データ内のメッセージ境界を維持する Rdm(Reliably Delivered Messages) メッセージは複製されず 順番に到着する 亦 メッセージが失われた時には送信元に通知される Rdm を使用して Socket を初期化した場合には データの送受信の前にリモートホストに接続して置く必要は無い Rdm では複数のピアと通信出来る Seqpacket ネットワーク全体に 順序付きバイトストリームの コネクション指向で信頼性の高い双方向転送を提供する Seqpacket はデータを複製せず データストリーム内の境界を維持する Seqpacket 型の Socket は単一のピアと通信し 通信を開始する前にリモートホスト接続を確立して置く必要が有る Stream データの複製と境界の維持を行う事無く 信頼性が高く双方向の 接続ベースのバイトストリームをサポートする 此の型の Socket は単一のピアと通信し 通信を開始する前にリモートホスト接続を確立して置く必要が有る Stream は伝送制御プロトコル (Tcp) ProtocolType 及び InterNetworkAddressFamily を使用する Unknown 不明な Socket 型を指定する -7-

ProtocolType 列挙体は Socket で通信する時に使用するネットワークプロトコルを指定する 例えば ProtocolType.Tcp はソケットが TCP を使用する事を示し ProtocolType.Udp はソケットが UDP を使用する事を示す メンバ名 説明 Ggp ゲートウェイ間プロトコル Icmp インターネットコントロールメッセージプロトコル IcmpV6 IPv6 用インターネットコントロールメッセージプロトコル Idp インターネットデータグラムプロトコル Igmp インターネットグループ管理プロトコル IP インターネットプロトコル IPSecAuthenticationHeader IPv6 認証ヘッダー IPSecEncapsulatingSecurityPayload IPv6 カプセル化セキュリティペイロードヘッダー IPv4 インターネットプロトコル Version 4 IPv6 インターネットプロトコル Version 6 (IPv6) IPv6DestinationOptions IPv6 終点オプションヘッダー IPv6FragmentHeader IPv6 フラグメントヘッダー IPv6HopByHopOptions IPv6 ホップバイホップオプションヘッダー IPv6NoNextHeader IPv6 次ヘッダー無し IPv6RoutingHeader IPv6 経路制御ヘッダー Ipx インターネットパケット交換プロトコル ND Net Disk プロトコル ( 非公式 ) Pup PARC Universal Packet プロトコル Raw Raw IP パケットプロトコル Spx 順次編成パック交換プロトコル SpxII 順次編成パック交換 Version 2 プロトコル Tcp 伝送制御プロトコル Udp ユーザーデータグラムプロトコル Unknown 未確認のプロトコル Unspecified 指定されて居ないプロトコル Socket を作成したら 其のソケットでリモートのエンドポイントへの接続を開始したり リモートデバイスからの接続を受け入れたり出来る -8-

クライアントソケットの使用 Socket を使用した通信を開始する前に アプリケーションとリモートデバイスとの間にデータパイプを作成して置く必要が有る ネットワークアドレスファミリやプロトコルには様々な種類が有るが 此の例では リモートサービスへの TCP/IP 接続を作成する方法を示す TCP/IP では サービスを一意に識別する為にネットワークアドレスとサービスポート番号を使用する ネットワークアドレスは ネットワーク上の特定のデバイスを識別し ポート番号は 其のデバイス上に有る特定のサービスを接続先と仕て識別する ネットワークアドレスとサービスポートの組み合わせはエンドポイントと呼ばれ.NET Framework では EndPoint クラスに依り表される サポートされて居るアドレスファミリ毎に EndPoint の子孫が定義されて居る IP アドレスファミリの場合は 此のクラスは IPEndPoint で有る Dns クラスは TCP/IP インターネットサービスを使用するアプリケーションにドメインネームサービスを提供する Resolve メソッドは DNS サーバーに照会し ユーザーが認識し易いドメイン名 ("host.contoso.com" 等 ) を数値のインターネットアドレス (192.168.1.1 等 ) にマップする Resolve メソッドは 要求された名前に関するアドレスとエイリアスの一覧を保持した IPHostEnty を返す 多くの場合 AddressList 配列で返された最初のアドレスを使用出来る host.contoso.com サーバーの IP アドレスを保持した IPAddress を取得するコード例を次に示す Dim iphostinfo As IPHostEntry = Dns.Resolve("host.contoso.com") Dim ipaddress As IPAddress = iphostinfo.addresslist(0) IPHostEntry iphostinfo = Dns.Resolve("host.contoso.com"); IPAddress ipaddress = iphostinfo.addresslist[0]; 一般的なサービスが使用するポート番号は IANA(Internet Assigned Numbers Authority) が定義して居る 詳細に付いては http://www.iana.org/assignments/port-numbers( 英語情報 ) を参照され度い 其他のサービスでは 1,024 ~ 65,535 の範囲の登録済みポート番号を使用出来る host.contoso.com の IP アドレスをポート番号と組み合わせて 接続のリモートエンドポイントを作成するコード例を次に示す Dim ipe As New IPEndPoint(ipAddress, 11000) IPEndPoint ipe = new IPEndPoint(ipAddress,11000); リモートデバイスのアドレスを確認し 接続に使用するポートを選択すれば アプリケーションはリモートデバイスとの接続を確立しようとする 既存の IPEndPoint を使用してリモートデバイスに接続し 例外がスローされた場合には其の例外をキャッチするコード例を次に示す Try s.connect(ipe) Catch ae As ArgumentNullException Console.WriteLine("ArgumentNullException : 0", ae.tostring( )) Catch se As SocketException -9-

Console.WriteLine("SocketException : 0", se.tostring( )) Catch e As Exception Console.WriteLine("Unexpected exception : 0", e.tostring( )) End Try try s.connect(ipe); catch(argumentnullexception ae) Console.WriteLine("ArgumentNullException : 0", ae.tostring( )); catch(socketexception se) Console.WriteLine("SocketException : 0", se.tostring( )); catch(exception e) Console.WriteLine("Unexpected exception : 0", e.tostring( )); -10-

ソケットを使用したリッスン リスナやサーバーソケットは ネットワーク上のポートを開いてから クライアントが其のポートに接続するのを待機する ネットワークアドレスファミリやプロトコルには様々な種類が有るが 此の例では TCP/IP ネットワーク用のリモートサービスを作成する方法を示す TCP/IP サービスの一意なアドレスは ホストの IP アドレスとサービスのポート番号の組み合わせで定義され 此の組み合わせに依りサービスのエンドポイントが作成される Dns クラスは ローカルのネットワークデバイスでサポートされるネットワークアドレスに関する情報を返すメソッドを提供する ローカルのネットワークデバイスに複数のネットワークアドレスが有る場合 又は ローカルシステムで複数のネットワークデバイスがサポートされて居る場合 Dns クラスは総てのネットワークアドレスに関する情報を返す為 アプリケーションではサービスの正しいアドレスを選択する必要が有る 一般的なサービスが使用するポート番号は IANA(Internet Assigned Numbers Authority) が定義して居る 詳細に付いては http://www.iana.org/assignments/port-numbers( 英語情報 ) を参照され度い 其他のサービスでは 1,024 ~ 65,535 の範囲の登録済みポート番号を使用出来る ホストコンピュータに対して Dns が返した最初の IP アドレスと 登録済みのポート番号範囲から選択したポート番号を組み合わせて サーバーの IPEndPoint を作成するコード例を次に示す Dim iphostinfo As IPHostEntry = Dns.Resolve(Dns.GetHostName()) Dim ipaddress As IPAddress = iphostinfo.addresslist(0) Dim localendpoint As New IPEndPoint(ipAddress, 11000) IPHostEntry iphostinfo = Dns.Resolve(Dns.GetHostName()); IPAddress ipaddress = iphostinfo.addresslist[0]; IPEndPoint localendpoint = new IPEndPoint(ipAddress, 11000); ローカルエンドポイントを確認したら Bind メソッドを使用して Socket を其のエンドポイントに関連付け Listen メソッドを使用して 其のエンドポイントでリッスンする様に設定する 指定したアドレスとポート番号の組み合わせが既に使用されて居る場合 Bind は例外をスローする Socket を IPEndPoint に関連付けるコード例を次に示す listener.bind(localendpoint) listener.listen(100) listener.bind(localendpoint); listener.listen(100); Listen メソッドは Socket に対して保留出来る接続数を指定するパラメータを 1 つ受け取る 此の数を超えると 接続しようとするクライアントに対して サーバーがビジー状態で有る事を示すエラーが返される 此の例は 最大で 100 のクライアントを接続キューに配置し 101 番目のクライアントにはサーバーがビジー状態で有る事を示す応答を返す -11-

TCP/UDP アプリケーションで伝送制御プロトコル (TCP:Transmission Control Protocol) サービスやユーザーデータグラムプロトコル (UDP:User Datagram Protocol) サービスを使用するには TcpClient クラス TcpListener クラス 及び UdpClient クラスを使用する 此等のプロトコルクラスは System.Net.Sockets.Socket クラスの上位に構築され データ伝送の詳細を制御する 此等のプロトコルクラスは Socket クラスの同期メソッドを使用して 状態情報を維持したり プロトコル固有ソケットの設定に付いての詳細に対応したりする必要の無いネットワークサービスへの簡単で直接的なアクセスを提供する 非同期の Socket メソッドを使用するには NetworkStream クラスが提供する非同期メソッドを使用する Socket クラスの機能の内 プロトコルクラスに依っては公開されない機能にアクセスするには Socket クラスを使用する必要が有る TcpClient と TcpListener は NetworkStream クラスを使用してネットワークを表す GetStream メソッドを使用してネットワークストリームを取得し 続いて其のストリームの Read メソッドや Write メソッドを呼び出す事が出来る NetworkStream は プロトコルクラスの元に成って居るソケットを所有して居ない為 終了してもソケットに影響する事は無い UdpClient クラスは UDP データグラムを保持する為にバイト配列を使用する ネットワークにデータを送信するには Send メソッドを使用し 着信データグラムを受信するには Receive メソッドを使用する TCP サービスの使用 TcpClient クラスは TCP を使用してインターネットリソースからのデータを要求する TcpClient のメソッドやプロパティを使用すると TCP を使用してデータを要求 及び 受信する為の Socket の作成に付いて詳細を考慮する必要が無く成る リモートデバイスへの接続がストリームと仕て表される為.NET Framework のストリーム処理技術に依りデータを読み書き出来る TCP プロトコルは リモートのエンドポイントとの接続を確立してから 其の接続を使用してデータパケットの送受信を行う TCP は データパケットが確実にエンドポイントに送信され 着信時に正しい順序で組み立てられる様にする TCP 接続を確立するには 必要なサービスをホストするネットワークデバイスのアドレスと 其のサービスが通信に使用する TCP ポートを把握して置く必要が有る 一般的なサービスが使用するポート番号は IANA ( Internet Assigned Numbers Authority ) が定義して居る http://www.iana.org/assignments/port-numbers( 英語情報 ) を参照され度い IANA の一覧に記載されて居ないサービスは 1,024 ~ 65,535 の範囲のポート番号を使用出来る TCP のポート番号 13 でタイムサーバーに接続する様に TcpClient を設定するコード例を次に示す Imports System Imports System.Net.Sockets Imports System.Text Public Class TcpTimeClient Private const portnum As Integer = 13 Private const hostname As String = "host.contoso.com" -12-

' Entry point that delegates to C-style main Private Function. Public Overloads Shared Sub Main() System.Environment.ExitCode = _ Main(System.Environment.GetCommandLineArgs()) End Sub Overloads Public Shared Function Main(args() As [String]) As Integer Try Dim client As New TcpClient(hostName, portnum) Dim ns As NetworkStream = client.getstream() Dim bytes(1024) As Byte Dim bytesread As Integer = ns.read(bytes, 0, bytes.length) Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, bytesread)) Catch e As Exception Console.WriteLine(e.ToString()) End Try client.close() Return 0 End Function 'Main End Class 'TcpTimeClient using System; using System.Net.Sockets; using System.Text; public class TcpTimeClient private const int portnum = 13; private const string hostname = "host.contoso.com"; public static int Main(String[] args) try TcpClient client = new TcpClient(hostName, portnum); NetworkStream ns = client.getstream(); byte[] bytes = new byte[1024]; int bytesread = ns.read(bytes, 0, bytes.length); Console.WriteLine(Encoding.ASCII.GetString(bytes,0,bytesRead)); client.close(); catch (Exception e) Console.WriteLine(e.ToString()); return 0; TcpListener は TCP ポートに着信する要求を監視し 要求が着信すると クライアントへの接続を管理する Socket か TcpClient の孰れかを作成する ポート上でのリッスンを有効にするには Start メソッドを使用し 無効にするには Stop メソッドを使用する AcceptTcpClient メソッドは 着信した接続要求を受け入れ TcpClient を作成して要求を処理するが AcceptSocket メソッドは 着信した接続要求を受け入れ Socket を作成して要求を処理する -13-

TcpListener を使用して TCP のポート番号 13 を監視するネットワークタイムサーバーを作成するコード例を次に示す 着信した接続要求が受け入れられると 此のタイムサーバーは応答と仕てホストサーバーの現在の日時を返す Imports System Imports System.Net.Sockets Imports System.Text Public Class TcpTimeServer Private const portnum As Integer = 13 ' Entry point that delegates to C-style main Private Function. Public Overloads Shared Sub Main() System.Environment.ExitCode = _ Main(System.Environment.GetCommandLineArgs()) End Sub Overloads Public Shared Function Main(args() As [String]) As Integer Dim done As Boolean = False Dim listener As New TcpListener(portNum) listener.start() While Not done Console.Write("Waiting for connection...") Dim client As TcpClient = listener.accepttcpclient() Console.WriteLine("Connection accepted.") Dim ns As NetworkStream = client.getstream() Dim bytetime As Byte() = Encoding.ASCII.GetBytes(DateTime.Now.ToString()) Try ns.write(bytetime, 0, bytetime.length) ns.close() client.close() Catch e As Exception Console.WriteLine(e.ToString()) End Try End While listener.stop() Return 0 End Function 'Main End Class 'TcpTimeServer using System; using System.Net.Sockets; using System.Text; public class TcpTimeServer private const int portnum = 13; -14-

public static int Main(String[] args) bool done = false; TcpListener listener = new TcpListener(portNum); listener.start(); while (!done) Console.Write("Waiting for connection..."); TcpClient client = listener.accepttcpclient(); Console.WriteLine("Connection accepted."); NetworkStream ns = client.getstream(); byte[] bytetime = Encoding.ASCII.GetBytes(DateTime.Now.ToString()); try ns.write(bytetime, 0, bytetime.length); ns.close(); client.close(); catch (Exception e) Console.WriteLine(e.ToString()); listener.stop(); return 0; UDP サービスの使用 UdpClient クラスは UDP を使用してネットワークサービスと通信する UdpClient クラスのプロパティやメソッドを使用すると UDP を使用してデータを要求 及び 受信する為の Socket の作成に付いて詳細を考慮する必要が無く成る ユーザーデータグラムプロトコル (UDP:User Datagram Protocol) は データをリモートホストに送信するのに役立つシンプルなプロトコルで有る 併し UDP プロトコルはコネクションレスプロトコルで有る為 リモートのエンドポイントに送信される UDP データグラムは送信先に着信する保証が無く 着信した場合でも 送信時と同じ順序で着信するか何うかは保証されない UDP を使用するアプリケーションは データグラムが欠損した場合や 重複して居る場合 及び 順序が乱れて居る場合に対処出来る様に仕て置く必要が有る UDP を使用してデータグラムを送信するには 必要なサービスをホストするネットワークデバイスのネットワークアドレスと 其のサービスが通信に使用する UDP ポート番号を把握して置く必要が有る 一般的なサービスが使用するポート番号は IANA(Internet Assigned Numbers Authority) が定義して居る http://www.iana.org/assignments/port-numbers( 英語情報 ) を参照され度い IANA の一覧に記載されて居ないサービスは 1,024 ~ 65,535 の範囲のポート番号を使用出来る IP ベースのネットワークで UDP ブロードキャストメッセージをサポートする為には 専用のネットワークアドレスが使用される 以下の説明では インターネットで使用されて居る IP バージョン 4 アドレスファミリを例と仕て使用する -15-

IP バージョン 4 のアドレスは 32 ビットでネットワークアドレスを指定する ネットマスクと仕て 255.255.255.0 を使用して居るクラス C アドレスでは 此等のビットは 4 つのオクテットに分割される 此等の 4 つのオクテットを 10 進数で表現すると 192.168.100.2 の様に ピリオドで 4 つの部分に区切られた一般的な表記に成る 最初の 2 つのオクテット ( 此の例では 192.168) はネットワーク番号を表し 3 番目のオクテット (100) はサブネットを定義し 最後のオクテット (2) はホスト識別子を表す IP アドレスの総てのビットを 1 に設定すると (255.255.255.255) 制限されたブロードキャストアドレスに成る UDP データグラムを此のアドレスに送信すると 其のメッセージはローカルネットワークセグメント上の総てのホストに送られる ルーターは 此のアドレス宛てのメッセージを転送しない為 ネットワークセグメント上のホスト丈が ブロードキャストメッセージを受信する事に成る ホスト識別子の総てのビットを設定すると ネットワークの特定の部分にブロードキャストを送信出来る 例えば 192.168.1 で始まる IP アドレスで識別されるネットワーク上の総てのホストにブロードキャストを送信するには 192.168.1.255 と謂うアドレスを使用する UdpClient を使用して ダイレクトブロードキャストアドレス 192.168.1.255 に送信されるデータグラムをポート 11,000 上でリッスンするコード例を次に示す クライアントは メッセージ文字列を受信して 其のメッセージをコンソールに書き込む Imports System Imports System.Net Imports System.Net.Sockets Imports System.Text Public Class UDPListener Private Const listenport As Integer = 11000 Private Shared Sub StartListener() Dim done As Boolean = False Dim listener As New UdpClient(listenPort) Dim groupep As New IPEndPoint(IPAddress.Any, listenport) Try While Not done Console.WriteLine("Waiting for broadcast") Dim bytes As Byte() = listener.receive(groupep) Console.WriteLine("Received broadcast from 0 :", groupep.tostring()) Console.WriteLine( _ Encoding.ASCII.GetString(bytes, 0, bytes.length)) Console.WriteLine() End While Catch e As Exception Console.WriteLine(e.ToString()) Finally listener.close() End Try End Sub 'StartListener Public Shared Function Main() As Integer StartListener() Return 0 End Function 'Main End Class 'UDPListener -16-

using System; using System.Net; using System.Net.Sockets; using System.Text; public class UDPListener private const int listenport = 11000; private static void StartListener() bool done = false; UdpClient listener = new UdpClient(listenPort); IPEndPoint groupep = new IPEndPoint(IPAddress.Any,listenPort); try while (!done) Console.WriteLine("Waiting for broadcast"); byte[] bytes = listener.receive( ref groupep); Console.WriteLine("Received broadcast from 0 : n 1 n", groupep.tostring(), Encoding.ASCII.GetString(bytes,0,bytes.Length)); catch (Exception e) Console.WriteLine(e.ToString()); finally listener.close(); public static int Main() StartListener(); return 0; UdpClient を使用して ポート 11,000 を経由してダイレクトブロードキャストアドレス 192.168.1.255 に UDP データグラムを送信するコード例を次に示す クライアントは コマンドラインで指定したメッセージ文字列を送信する Imports System Imports System.Net Imports System.Net.Sockets Imports System.Text -17-

Public Class Program Overloads Public Shared Function Main(args() As [String]) As Integer Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp) Dim broadcast As IPAddress = IPAddress.Parse("192.168.1.255") Dim sendbuf As Byte() = Encoding.ASCII.GetBytes(args(0)) Dim ep As New IPEndPoint(broadcast, 11000) s.sendto(sendbuf, ep) Console.WriteLine("Message sent to the broadcast address") End Function 'Main End Class using System; using System.Net; using System.Net.Sockets; using System.Text; class Program static void Main(string[] args) Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp); IPAddress broadcast = IPAddress.Parse("192.168.1.255"); byte[] sendbuf = Encoding.ASCII.GetBytes(args[0]); IPEndPoint ep = new IPEndPoint(broadcast, 11000); s.sendto(sendbuf, ep); Console.WriteLine("Message sent to the broadcast address"); ネットワークでのストリームの使用.NET Framework では ネットワークリソースはストリームと仕て表される.NET Framework では ストリームを汎用的に扱う事に依り 次の機能を実現する Web データを送受信する為の共通の方法が提供される HTML や XML 等 ファイルの実際の内容に関係無く アプリケーションでは データの送受信に Stream.Write 及び Stream.Read が使用される.NET Framework 全体でストリームの互換性が確保される ストリームは ストリームを処理する為の豊富なインフラストラクチャが用意されて居る.NET Framework 全体で使用される 例えば ストリームを初期化する数行のコードを変更する丈で FileStream から XML データを読み取るアプリケーションを NetworkStream からデータを読み取る様に変更出来る NetworkStream クラスと其れ以外のストリームの主な相違点は NetworkStream がシーク可能で無い事 CanSeek プロパティは常に false を返す事 及び Seek メソッドと Position メソッドが NotSupportedException をスローする事で有る データが到着すると 直ぐに処理される ストリームでは ネットワークからデータが到着すると直ぐにアクセス出来る アプリケーションは データセット全体がダウンロードされる迄待機する必要は無い System.Net.Sockets 名前空間には ネットワークリソースで使用する為の Stream クラスを実装する -18-

NetworkStream クラスが含まれて居る System.Net.Sockets 名前空間内のクラスは NetworkStream クラスを使用してストリームを表す 返されたストリームを使用してネットワークにデータを送信するには WebRequest で GetRequestStream を呼び出す WebRequest は 要求のヘッダーをサーバーに送信する 此の後 返されたストリームで BeginWrite メソッド EndWrite メソッド 又は Write メソッドを呼び出して ネットワークリソースにデータを送信出来る HTTP 等の一部のプロトコルでは データを送信する前に プロトコル固有のプロパティを設定する必要が有る場合が有る データを送信する為に HTTP 固有のプロパティを設定する方法を次のコード例に示す 此の例では 変数 senddata には送信するデータが 変数 sendlength には送信するデータのバイト数が格納される事を前提と仕て居る Dim request As HttpWebRequest = _ CType(WebRequest.Create("http://www.contoso.com/"), HttpWebRequest) request.method = "POST" request.contentlength = sendlength Try Dim sendstream As Stream = request.getrequeststream() sendstream.write(senddata, 0, sendlength) sendstream.close() Catch ' Handle errors... End Try HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://www.contoso.com/"); request.method = "POST"; request.contentlength = sendlength; try Stream sendstream = request.getrequeststream(); sendstream.write(senddata,0,sendlength); sendstream.close(); catch // Handle errors... ネットワークからデータを受信するには WebResponse で GetResponseStream を呼び出す 次に 返されたストリームで BeginRead メソッド EndRead メソッド 又は Read メソッドを呼び出して ネットワークリソースからデータを読み取る事が出来る ネットワークリソースからのストリームを使用する時は 次の点を念頭に置いて欲しい CanSeek プロパティは常に false を返す 此れは NetworkStream クラスはストリーム内で位置を変更出来ない為で有る Seek メソッドと Position メソッドは NotSupportedException をスローする WebRequest と WebResponse を使用する場合 GetResponseStream の呼び出しで作成されるストリームインスタンスは読み取り専用で有り GetRequestStream の呼び出しで作成されるストリームインスタンスは書き込み専用で有る -19-

エンコードを簡単にするには StreamReader クラスを使用する 次に示すコード例では StreamReader を使用して ASCII エンコードされたストリームを WebResponse から読み取る 此の例では 要求を作成するコードは示して居ない ネットワークリソースが使用出来ない場合 GetResponse の呼び出しがブロックされる事が有る BeginGetResponse メソッドと EndGetResponse メソッドに依る非同期要求の使用を考慮され度い サーバーへの接続が作成されて居る間 GetRequestStream の呼び出しがブロックされる事が有る BeginGetRequestStream メソッドと EndGetRequestStream メソッドに依るストリームの非同期要求の使用を考慮され度い ' Create a response object. Dim response As WebResponse = request.getresponse() ' Get a readable stream from the server. Dim sr As New StreamReader(response.GetResponseStream(), Encoding.ASCII) ' Use the stream. Remember when you are through with the stream to close it. sr.close() // Create a response object. WebResponse response = request.getresponse(); // Get a readable stream from the server. StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.ASCII); // Use the stream. Remember when you are through with the stream to close it. sr.close(); -20-