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);
}
}
次の例では、タスクベースの非同期 API を使用しながら、 を非同期メソッドに転送 CancellationToken し、操作全体を取り消し可能にする、同じ HTTP GET シナリオを示します。
ヒント
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);
}
}
注釈
この API の詳細については、「Socket の 補足 API 解説」を参照してください。
コンストラクター
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 実行しても安全ですが、複数の送受信呼び出しを同時に発行することはお勧めしません。 基になるプラットフォームの実装によっては、大規模またはマルチバッファーの送受信に意図しないデータ インターリーブが発生する可能性があります。
こちらもご覧ください
.NET