StreamSocket クラス

定義

UWP アプリで TCP または Bluetooth RFCOMM 経由のストリーム ソケットを使用したネットワーク通信をサポートします。

public ref class StreamSocket sealed : IClosable
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class StreamSocket final : IClosable
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
class StreamSocket final : IClosable
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class StreamSocket : System.IDisposable
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
public sealed class StreamSocket : System.IDisposable
function StreamSocket()
Public NotInheritable Class StreamSocket
Implements IDisposable
継承
Object Platform::Object IInspectable StreamSocket
属性
実装

Windows の要件

デバイス ファミリ
Windows 10 (10.0.10240.0 で導入)
API contract
Windows.Foundation.UniversalApiContract (v1.0 で導入)
アプリの機能
bluetooth.rfcomm ID_CAP_NETWORKING [Windows Phone] internetClient privateNetworkClientServer

このクラスを使用するサンプル アプリケーションには、Bluetooth RFCOMM チャット サンプルDatagramSocket サンプル (Windows 10)ソケット アクティビティ トリガー ストリーム ソケット サンプルStreamSocket サンプル (Windows 10)Wi-Fi Directサンプルが含まれます。

注釈

StreamSocket クラスは、UWP アプリで TCP または Bluetooth RFCOMM 経由でストリーム ソケットを使用するネットワーク通信をサポートします。

クライアント アプリの場合、StreamSocket を使用する操作の最も一般的なシーケンスは次のとおりです。

  • StreamSocket を作成します。
  • Control プロパティを使用して StreamSocketControl オブジェクトを取得し、ConnectAsync メソッドのいずれかを呼び出す前に StreamSocketControl オブジェクトのプロパティを設定します。
  • ConnectAsync メソッドのいずれかを呼び出して、リモート エンドポイントとの接続を確立します。 Bluetooth の場合、リモート サービス名は Bluetooth サービス ID です。 TCP の SSL/TLS 接続または Bluetooth の暗号化レベルがすぐに必要な場合は、 ConnectAsync メソッドの一部を使用してこれを指定できます。 TCP ソケットの初期データを送受信した後に SSL/TLS 接続が必要な場合は、 後で UpgradeToSslAsync メソッドを呼び出して、SSL を使用するように接続をアップグレードできます。
  • OutputStream プロパティを取得して、リモート ホストにデータを書き込みます。
  • InputStream プロパティを取得して、リモート ホストからデータを読み取ります。
  • 必要に応じて、データの読み取りと書き込みを行います。
  • Close メソッドを呼び出してソケットを切断し、保留中の操作を中止し、StreamSocket オブジェクトに関連付けられているすべてのアンマネージ リソースを解放します。

注意

Close メソッドは、JavaScript で記述された UWP アプリによって使用されます。 C# と VB.NET で .NET Framework 4.5 を使用して作成されたアプリの場合、Close メソッドは StreamSocket の メソッドとして公開されます。 C++ で記述されたアプリの場合、 オブジェクトで削除キーワード (keyword)を使用すると、Close メソッドが呼び出されます。

StreamSocket オブジェクトを明示的に閉じる ( Close メソッドを呼び出す) と、ソケットに保留中の読み取りまたは書き込み操作が存在しない場合、正常な切断が保証されます。 保留中のすべての読み取りは自動的に中止され、StreamSocket は接続を破棄する前に進行中の I/O が完了するまで待機します。 進行中の I/O が完了した後に未読データがソケットに残っていない場合は、正常な切断 (FIN) が発生することが保証されます。 それ以外の場合は、非グレースフル切断 (RST) が発生します。

アクティブな (まだ接続されている) StreamSocket オブジェクトがスコープ外になると、中止 (正常でない) 切断が発生する可能性があります。これにより、以前に送信されたデータがリモート ピアによって読み取られる前に破棄される可能性があります。 スコープから外れる前に、StreamSocket オブジェクトで Close (JavaScript の Close メソッド、C# および VB.NET のメソッド、または C++ の delete 演算子) を呼び出す必要があることを強くお勧めします。

読み取り操作または書き込み操作が取り消されるたびに、I/O 操作は Error 状態で完了し、関連付けられている StreamSocket オブジェクトは接続を直ちに破棄します。これにより、未読または未送信のデータがソケットに残っている場合は、非優先切断 (RST) が発生します。

異常終了 (アプリがクラッシュするなど) が発生した場合、常に非優先切断 (RST) が発生します。または、ネットワーク スタックによって異常な接続エラーが検出された場合 (TCP 再送信タイムアウトなど)。

StreamSocket オブジェクトは StreamSocketListener オブジェクトと組み合わせて使用され、サーバー アプリまたはピアツーピア アプリで TCP または Bluetooth RFCOMM 経由で受信接続をリッスンします。 StreamSocketListener オブジェクトが TCP または Bluetooth RFCOMM 接続要求を受信すると、ConnectionReceived イベントの Socket プロパティによって StreamSocket オブジェクトが返されます。 詳細については、「 StreamSocketListener」を参照してください。

プロキシのサポート

UWP アプリでは、接続を完了するためにプロキシが必要な場合、StreamSocket クラスはリモート エンドポイントへの接続をサポートします。 このプロキシのサポートは、アプリに対して自動的かつ透過的です。 StreamSocket は、認証プロキシと、認証が必要ない他のプロキシを介して接続を確立できます。 プロキシの認証は、インターネット エクスプローラーまたは Windows.Web.Http 名前空間の HttpClient クラスを使用するアプリがプロキシで正常に認証され、以前に認証に使用された資格情報がまだ有効な場合にのみ機能します。 認証資格情報をプロキシに提供するためにインターネット エクスプローラー以外の Web ブラウザーを使用した場合、プロキシの認証のサポートは機能しません。 ConnectAsync メソッドでローカル ホスト アドレスまたは特定のネットワーク アダプターが指定されている場合、プロキシ経由での接続はサポートされません。

UWP アプリでは、StreamSocket オブジェクトの ConnectAsync メソッドは、接続の確立を高速化するために、名前解決の前後にプロキシと現在のプロキシ構成を検出しようとします。 サービス名ではなくエンドポイントにポートが指定されている場合、プロキシ検出と名前解決の両方が内部的に開始されます。 名前解決の前にプロキシ検出が完了し、ProxyConfiguration オブジェクトの CanConnectDirectly プロパティが false の場合、プロキシ接続が試行されます。 名前解決が完了すると、解決されたエンドポイント アドレスを使用してプロキシ検出が再度開始され、現在のプロキシ構成が決定されます。 CanConnectDirectly が名前解決後にアプリがリモート エンドポイントに直接接続できることを示す場合は、ソケット接続がエンドポイントに直接試行されます。 名前解決後 に CanConnectDirectlyfalse の 場合、ソケット接続がエンドポイントに直接試行され、プロキシ経由で並列ソケット接続が試行されます。 成功する最初の接続は StreamSocket によって使用され、他の接続は取り消されます。

CanConnectDirectlyfalse を返す場合がありますが、リソースに直接アクセスできないわけではありません。 ローカル ネットワークは、プロキシとネットワーク アドレス変換 (NAT) の両方をサポートするように構成できます。 Web ブラウザーまたは HttpClient にプロキシ情報を提供するために使用される WPAD スクリプトは、プロキシを使用する必要があることを Windows に指示します。 これにより、リモート エンドポイントがプロキシ接続 (HTTP CONNECT 要求など) を想定していない場合に問題が発生する可能性があります。 アプリでは、NetworkInformation オブジェクトで GetProxyConfigurationAsync メソッドを使用して、uri パラメーターのリモート エンドポイントとポートを渡してプロキシ情報を取得し、この条件が疑われるタイミングを判断できます。 サーバーが直接接続のみを処理できる場合にプロキシ接続要求が送信されないようにする方法は、特定のネットワーク アダプターを選択するとプロキシ関連のロジックが無効になるため、 ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter) メソッドを使用することです。

Windows Phone 8.x アプリでは、Windows Phoneで ProxyConfiguration クラスがサポートされていないため、StreamSocket はプロキシの自動サポートを提供しません。

例外の処理

StreamSocket クラスで非同期メソッドを呼び出すときに例外を処理するコードを記述する必要があります。 例外は、パラメーター検証エラー、名前解決エラー、およびネットワーク エラーによって発生する可能性があります。 ネットワーク エラーの例外 (接続の損失、接続エラー、サーバーエラーなど) は、いつでも発生する可能性があります。 これらのエラーが起きると、例外がスローされます。 アプリによって処理されない場合は、例外によってアプリ全体がランタイムによって終了する可能性があります。

Windows.Networking.Sockets 名前空間には、ソケット使用時のエラー処理を簡略化する機能があります。 SocketError クラスの GetStatus メソッドは、例外から SocketErrorStatus 列挙値に HRESULT を変換できます。 これは、アプリで特定のネットワーク例外を異なる方法で処理する場合に役立つことがあります。 アプリでは、パラメーター検証エラーの例外から HRESULT を使用して、例外の原因となったエラーの詳細を確認することもできます。

可能な例外と例外の処理方法の詳細については、「 ネットワーク アプリでの例外の処理」を参照してください。

近接、Wi-Fi Direct、Bluetooth での StreamSocket の使用

アプリでは、近距離にあるデバイス間のネットワーク接続に StreamSocket を使用できます。 Windows.Networking.Proximity 名前空間のクラスは、Bluetooth または Wi-Fi Direct を使用する近くのデバイスへの StreamSocket とのネットワーク接続をサポートします。 PeerFinder Windows.Networking.Proximity 名前空間の関連クラスを使用すると、アプリは近くのデバイスでアプリの別のインスタンスを検出できます。 PeerFinder.FindAllPeersAsync メソッドは、ワイヤレス範囲内で同じアプリを実行しているピア コンピューターを参照します。 PeerFinder.ConnectAsync メソッドは、接続された StreamSocket を返します。この StreamSocket は、アプリが近くのピア アプリでネットワーク データを転送するために使用できます。 詳細については、「 近接とタップのサポート」、「 Windows.Networking.ProximityPeerFinder、および 近接サンプル」を参照してください。

アプリでは、 Windows.Devices.WiFiDirect 名前空間のクラスで Wi-Fi Direct を使用するデバイス間のネットワーク接続に StreamSocket を使用することもできます。 WiFiDirectDevice クラスを使用すると、Wi-Fi Direct (WFD) 対応デバイスを持つ他のデバイスを検索できます。 WiFiDirectDevice.GetDeviceSelector メソッドは、近くの WFD デバイスのデバイス識別子を取得します。 近くの WFD デバイスへの参照を取得したら、 WiFiDirectDevice.GetConnectionEndpointPairs メソッドを呼び出して EndpointPair オブジェクトを取得できます。 StreamSocket クラスの ConnectAsync(EndpointPair) または ConnectAsync(EndpointPair, SocketProtectionLevel) メソッドを使用して、ソケット接続を確立できます。 詳細については、「 Windows.Devices.WiFiDirect 」および「 WiFiDirectDevice」を参照してください。

Bluetooth では、ホスト名や IP アドレスではなく、StreamSocket 接続のエンドポイントとして Bluetooth サービス ID が使用されます。 Bluetooth で StreamSocket を使用するには、アプリ マニフェストで bluetooth.rfcomm デバイス機能を設定する必要があります。 詳細については、 Windows.Devices.Bluetooth.Rfcomm 名前空間、 Bluetooth のデバイス機能を指定する方法Bluetooth Rfcomm チャットのサンプルを参照してください。

Windows Server 2012での StreamSocket の使用

Windows Server 2012 および Windows Server 2012 R2 では、Media Foundation 機能が有効になっていない限り、Windows.Networking.Sockets 名前空間のほとんどのクラスを実装するWindows.Networking.dllは読み込みに失敗します。 その結果、Media Foundation 機能が無効になっている場合、 Windows.Networking.Sockets 名前空間で StreamSocket および関連するソケット クラスを使用するアプリは失敗します。 Windows Server 2012または Windows Server 2012 R2 は Media Foundation 機能を無効にしてインストールします。

Media Foundation 機能は、サーバー マネージャーを使用するか、コマンド プロンプトまたはスクリプトに次のテキストを入力して、Windows Server 2012または Windows Server 2012 R2 で有効にすることができます。

dism /online /enable-feature /featurename:ServerMediaFoundation Media Foundation 機能を有効にすると、ユーザーは再起動を求められます。 コンピューターが再起動されると、 Windows.Networking.Sockets 名前空間のソケットと WebSocket のクラスが期待どおりに動作します。

StreamSocket を使用した DNS サービス レコードの解決

アプリは、SRV レコードに属するターゲット DNS アドレスと通信できます。 たとえば、Contoso ドメインの拡張可能なメッセージングおよびプレゼンス プロトコル (XMPP) サービスは に _xmpp-client._tcp.contoso.com対応します。 このサービス名は、サーバー DNS 名 (例: xmpp-client01.contoso.com) に対応します。

そのサービスのサーバーの DNS アドレスに接続するには、StreamSocket インスタンスで次のメソッド呼び出しを使用します。

using Windows.Networking.Sockets;

StreamSocket socket = new StreamSocket();
socket.ConnectAsync(new HostName("contoso.com"), "xmpp-client");

プロトコルは、StreamSocket インスタンスの TCP と推定されます。 メソッドはアンダースコア文字を処理します。

DNS は、SRV 階層を持つよう構成できます。 DNS SRV リソース レコードの形式 _xmpp-client._service01._tcp.contoso.comは、 です。 この例では、StreamSocket インスタンスで次のメソッド呼び出しを使用します。

socket.ConnectAsync(new HostName("contoso.com"), "xmpp-client._service01");

これらのコード スニペットでは 、ConnectAsync を使用しますGetEndpointPairsAsync メソッドは、サービスに接続する場合と同様の使用方法をサポートします。

バージョン履歴

Windows のバージョン SDK バージョン 追加された値
1607 14393 GetEndpointPairsAsync(HostName,String)
1607 14393 GetEndpointPairsAsync(HostName,String,HostNameSortOptions)

コンストラクター

StreamSocket()

新しい StreamSocket オブジェクトを作成します。

プロパティ

Control

StreamSocket オブジェクトのソケット コントロール データを取得します。

Information

StreamSocket オブジェクトのソケット情報を取得します。

InputStream

StreamSocket オブジェクトのリモート宛先から読み取る入力ストリームを取得します。

OutputStream

StreamSocket オブジェクトのリモート ホストに書き込む出力ストリームを取得します。

メソッド

CancelIOAsync()

StreamSocket オブジェクトに対する保留中の読み取りと書き込みを取り消します。

Close()

StreamSocket オブジェクトを閉じます。

ConnectAsync(EndpointPair)

StreamSocket オブジェクトに対して非同期操作を開始し、EndpointPair オブジェクトとして指定されたリモート ネットワーク宛先に接続します。

ConnectAsync(EndpointPair, SocketProtectionLevel)

StreamSocket オブジェクトに対して非同期操作を開始し、EndpointPair オブジェクトおよび SocketProtectionLevel 列挙体として指定されたリモート ネットワーク宛先に接続します。 このメソッドは、JavaScript から呼び出し可能ではありません。

ConnectAsync(HostName, String)

StreamSocket オブジェクトに対して非同期操作を開始し、リモート ホスト名とリモート サービス名で指定されたリモート ネットワーク宛先に接続します。

ConnectAsync(HostName, String, SocketProtectionLevel)

StreamSocket オブジェクトに対して非同期操作を開始し、リモート ホスト名、リモート サービス名、SocketProtectionLevel で指定されたリモート宛先に接続します。

ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter)

指定したローカル ネットワーク アダプター上の StreamSocket オブジェクトに対して非同期操作を開始し、リモート ホスト名、リモート サービス名、 SocketProtectionLevel で指定されたリモート接続先に接続します。

Dispose()

アンマネージ リソースの解放またはリセットに関連付けられているアプリケーション定義のタスクを実行します。

EnableTransferOwnership(Guid)

アプリがアクティブでない間にこの StreamSocket のトラフィックが到着したときに、ソケット ブローカーによってアプリのバックグラウンド タスクがトリガーされるようにします。

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

システムがコネクト スタンバイ状態にある間にこの StreamSocket のトラフィックが到着したときに、ソケット ブローカーによってトリガーされるアプリのバックグラウンド タスクの機能を有効または無効にします。

GetEndpointPairsAsync(HostName, String)

リモート ネットワーク宛先に TCP パケットを送信するために使用できるリモート ホスト名とリモート サービス名に基づいて EndpointPair オブジェクトの一覧を取得します。

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

リモート ホスト名とリモート サービス名、および使用する並べ替え順序に基づいて 、EndpointPair オブジェクトの一覧を取得します。

TransferOwnership(String)

StreamSocket の所有権をソケット ブローカー サービスに転送します。これにより、ソケット アクティビティが監視され、アクティビティがある場合はバックグラウンド タスクを通じてアプリに通知されます。

TransferOwnership(String, SocketActivityContext)

StreamSocket の所有権をソケット ブローカー サービスに転送します。これにより、ソケット アクティビティが監視され、アクティビティがある場合はバックグラウンド タスクを通じてアプリに通知されます。 ソケットの新しい SocketActivityContext を指定します。

TransferOwnership(String, SocketActivityContext, TimeSpan)

StreamSocket の所有権をソケット ブローカー サービスに転送します。これにより、ソケット アクティビティが監視され、アクティビティがある場合はバックグラウンド タスクを通じてアプリに通知されます。 ソケットの新しい SocketActivityContext とキープ アライブ時間を指定します。

UpgradeToSslAsync(SocketProtectionLevel, HostName)

StreamSocket オブジェクトで SSL を使用するように接続されているソケットをアップグレードする非同期操作を開始します。

適用対象

こちらもご覧ください