Socket クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
Berkeley ソケット インターフェイスを実装します。
public ref class Socket : IDisposable
public class Socket : IDisposable
type Socket = class
interface IDisposable
Public Class Socket
Implements IDisposable
- 継承
-
Socket
- 実装
例
同期モード
次の例は、 クラスを Socket 使用して HTTP サーバーにデータを送信し、標準出力に ASCII 応答を出力する方法を示しています。 次の使用例は、ページ全体を受信するまで、呼び出し元のスレッドをブロックします。
private static void SendHttpRequest(Uri? uri = null, int port = 80)
{
uri ??= new Uri("http://example.com");
// Construct a minimalistic HTTP/1.1 request
byte[] requestBytes = Encoding.ASCII.GetBytes(@$"GET {uri.AbsoluteUri} HTTP/1.0
Host: {uri.Host}
Connection: Close
");
// Create and connect a dual-stack socket
using Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
socket.Connect(uri.Host, port);
// Send the request.
// For the tiny amount of data in this example, the first call to Send() will likely deliver the buffer completely,
// however this is not guaranteed to happen for larger real-life buffers.
// The best practice is to iterate until all the data is sent.
int bytesSent = 0;
while (bytesSent < requestBytes.Length)
{
bytesSent += socket.Send(requestBytes, bytesSent, requestBytes.Length - bytesSent, SocketFlags.None);
}
// Do minimalistic buffering assuming ASCII response
byte[] responseBytes = new byte[256];
char[] responseChars = new char[256];
while (true)
{
int bytesReceived = socket.Receive(responseBytes);
// Receiving 0 bytes means EOF has been reached
if (bytesReceived == 0) break;
// Convert byteCount bytes to ASCII characters using the 'responseChars' buffer as destination
int charCount = Encoding.ASCII.GetChars(responseBytes, 0, bytesReceived, responseChars, 0);
// Print the contents of the 'responseChars' buffer to Console.Out
Console.Out.Write(responseChars, 0, charCount);
}
}
非同期モード
2 番目の例では、タスク ベースの非同期 API を使用して同じ HTTP GET シナリオを示しながら、 を非同期メソッドに転送 CancellationToken し、操作全体を取り消すことができます。
ヒント
Socketを受け取 CancellationToken らない の非同期メソッドは、通常、ヒープに割り当てられる を返 Taskします。 取り消し可能なオーバーロードは常に ValueTask-returning です。これらを使用すると、ハイ パフォーマンス コードでの割り当てを減らすことができます。
private static async Task SendHttpRequestAsync(Uri? uri = null, int port = 80, CancellationToken cancellationToken = default)
{
uri ??= new Uri("http://example.com");
// Construct a minimalistic HTTP/1.1 request
byte[] requestBytes = Encoding.ASCII.GetBytes(@$"GET {uri.AbsoluteUri} HTTP/1.1
Host: {uri.Host}
Connection: Close
");
// Create and connect a dual-stack socket
using Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
await socket.ConnectAsync(uri.Host, port, cancellationToken);
// Send the request.
// For the tiny amount of data in this example, the first call to SendAsync() will likely deliver the buffer completely,
// however this is not guaranteed to happen for larger real-life buffers.
// The best practice is to iterate until all the data is sent.
int bytesSent = 0;
while (bytesSent < requestBytes.Length)
{
bytesSent += await socket.SendAsync(requestBytes.AsMemory(bytesSent), SocketFlags.None);
}
// Do minimalistic buffering assuming ASCII response
byte[] responseBytes = new byte[256];
char[] responseChars = new char[256];
while (true)
{
int bytesReceived = await socket.ReceiveAsync(responseBytes, SocketFlags.None, cancellationToken);
// Receiving 0 bytes means EOF has been reached
if (bytesReceived == 0) break;
// Convert byteCount bytes to ASCII characters using the 'responseChars' buffer as destination
int charCount = Encoding.ASCII.GetChars(responseBytes, 0, bytesReceived, responseChars, 0);
// Print the contents of the 'responseChars' buffer to Console.Out
await Console.Out.WriteAsync(responseChars.AsMemory(0, charCount), cancellationToken);
}
}
注釈
クラスには Socket 、ネットワーク通信用の豊富なメソッドとプロパティのセットが用意されています。 Socketクラスを使用すると、列挙に記載されている通信プロトコルのいずれかを使用して、同期データ転送と非同期データ転送の両方をProtocolType実行できます。
クラスはSocket、非同期メソッドの.NET Frameworkの名前付けパターンに従います。 たとえば、同期 Receive メソッドは非同期 ReceiveAsync バリアントに対応します。
同期操作モードには、次のメソッドを使用します。
TCP などの接続指向プロトコルを使用している場合、サーバーは メソッドを使用して接続を Listen リッスンできます。 メソッドは Accept 、受信した接続要求を処理し、リモート ホストとデータを通信するために使用できる を返 Socket します。 または メソッドを呼び出すには、これを使用SocketしますSendReceive。 ローカル IP アドレスとポート番号を Bind 指定する場合は、 メソッドを呼び出す前に メソッドを呼び出 Listen します。 基になるサービス プロバイダーに空きポートを割り当てる場合は、ポート番号 0 を使用します。 リッスンしているホストに接続する場合は、 メソッドを呼び出します Connect 。 データを通信するには、 メソッドまたは Receive メソッドをSend呼び出します。
UDP などのコネクションレス プロトコルを使用している場合は、接続をリッスンする必要はまったくありません。 メソッドを ReceiveFrom 呼び出して、受信データグラムを受け入れます。 データグラムを SendTo リモート ホストに送信するには、 メソッドを使用します。
通信を非同期的に処理するには、次のメソッドを使用します。
TCP などの接続指向プロトコルを使用している場合は、 を使用 ConnectAsync してリッスンしているホストに接続します。 または ReceiveAsync を使用してSendAsync、データを非同期的に通信します。 受信接続要求は、 を使用して AcceptAsync処理できます。
UDP などのコネクションレス プロトコルを使用している場合は、 を使用 SendToAsync してデータグラムを送信し ReceiveFromAsync、データグラムを受信できます。
1 つのソケットに対して複数の非同期操作を実行する場合、それらは必ずしも開始された順序で完了するとは限りません。
データの送受信が完了したら、 メソッドを Shutdown 使用して を Socket無効にします。 を呼び出 Shutdownした後、 メソッドを Close 呼び出して、 に関連付けられているすべてのリソースを解放します Socket。
Socketクラスを使用すると、 メソッドを使用して SetSocketOption を構成できますSocket。 メソッドを使用してこれらの設定を取得します GetSocketOption 。
コンストラクター
Socket(AddressFamily, SocketType, ProtocolType) |
指定したアドレス ファミリ、ソケットの種類、およびプロトコルを使用して、Socket クラスの新しいインスタンスを初期化します。 |
Socket(SafeSocketHandle) |
ソケット ハンドルを指定して Socket クラスの新しいインスタンスを初期化します。 |
Socket(SocketInformation) |
DuplicateAndClose(Int32) から返された値を指定して、Socket クラスの新しいインスタンスを初期化します。 |
Socket(SocketType, ProtocolType) |
指定したソケットの種類とプロトコルを使用して、Socket クラスの新しいインスタンスを初期化します。 オペレーティング システムが IPv6 をサポートしている場合、このコンストラクターはデュアルモード ソケットを作成します。それ以外の場合は、IPv4 ソケットが作成されます。 |
プロパティ
AddressFamily |
Socket のアドレス ファミリを取得します。 |
Available |
ネットワークから受信した、読み取り可能なデータ量を取得します。 |
Blocking |
Socket がブロッキング モードかどうかを示す値を取得または設定します。 |
Connected |
最後に実行された Send 操作または Receive 操作の時点で、Socket がリモート ホストに接続されていたかどうかを示す値を取得します。 |
DontFragment |
Socket でインターネット プロトコル (IP) データグラムの断片化を許可するかどうかを指定する値を、取得または設定します。 |
DualMode |
が IPv4 と IPv6 の両方に使用されるデュアルモード ソケットであるかどうかを Socket 示す値を取得または設定します。 |
EnableBroadcast | |
ExclusiveAddressUse |
Socket で 1 つのプロセスだけにポートのバインドを許可するかどうかを指定する Boolean 値を取得または設定します。 |
Handle |
Socket のオペレーティング システム ハンドルを取得します。 |
IsBound |
Socket が特定のローカル ポートにバインドされているかどうかを示す値を取得します。 |
LingerState |
Socket で、すべての保留中のデータを送信しようとするときにソケットを遅延して閉じるかどうかを指定する値を取得または設定します。 |
LocalEndPoint |
ローカル エンドポイントを取得します。 |
MulticastLoopback |
発信マルチキャスト パケットが送信元アプリケーションに配信されるかどうかを指定する値を取得または設定します。 |
NoDelay |
ストリーム Socket が Nagle アルゴリズムを使用するかどうかを指定する Boolean 値を取得または設定します。 |
OSSupportsIPv4 |
基になるオペレーティング システムおよびネットワーク アダプターが、インターネット プロトコル バージョン 4 (IPv4) をサポートするかどうかを示します。 |
OSSupportsIPv6 |
基になるオペレーティング システムおよびネットワーク アダプターが、インターネット プロトコル バージョン 6 (IPv6) をサポートするかどうかを示します。 |
OSSupportsUnixDomainSockets |
基になるオペレーティング システムで Unix ドメイン ソケットがサポートされているかどうかを示します。 |
ProtocolType |
Socket のプロトコルの種類を取得します。 |
ReceiveBufferSize |
Socket の受信バッファーのサイズを指定する値を取得または設定します。 |
ReceiveTimeout |
同期の Receive 呼び出しがタイムアウトするまでの合計時間を指定する値を取得または設定します。 |
RemoteEndPoint |
リモート エンドポイントを取得します。 |
SafeHandle |
現在の Socket オブジェクトによってカプセル化されているソケット ハンドルを表す SafeSocketHandle を取得します。 |
SendBufferSize |
Socket の送信バッファーのサイズを指定する値を取得または設定します。 |
SendTimeout |
同期の Send 呼び出しがタイムアウトするまでの合計時間を指定する値を取得または設定します。 |
SocketType |
Socket の型を取得します。 |
SupportsIPv4 |
互換性のために残されています。
互換性のために残されています。
互換性のために残されています。
互換性のために残されています。
現在のホストで IPv4 サポートが使用可能で有効になっているかどうかを示す値を取得します。 |
SupportsIPv6 |
互換性のために残されています。
互換性のために残されています。
互換性のために残されています。
互換性のために残されています。
互換性のために残されている特定の Dns メンバー向けに、フレームワークが IPv6 をサポートしているかどうかを示す値を取得します。 |
Ttl |
Socket によって送信されたインターネット プロトコル (IP) パケットの有効期間 (TTL) の値を指定する値を取得または設定します。 |
UseOnlyOverlappedIO |
互換性のために残されています。
ソケットで重複 I/O モードのみを使用するかどうかを指定する値を取得または設定します。 .NET 5 以降 (.NET Core バージョンを含む) では、値は常に |
メソッド
明示的なインターフェイスの実装
IDisposable.Dispose() |
この API は製品インフラストラクチャをサポートします。コードから直接使用するものではありません。 Socket によって使用されているすべてのリソースを解放します。 |
拡張メソッド
適用対象
スレッド セーフ
インスタンスで送受信操作を同時に Socket 実行しても安全ですが、複数の送受信呼び出しを同時に発行することはお勧めしません。 基になるプラットフォームの実装によっては、大規模またはマルチバッファーの送受信に意図しないデータ インターリーブが発生する可能性があります。
こちらもご覧ください
フィードバック
フィードバックの送信と表示