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 サーバーにデータを送信し、応答を受信する方法を示しています。 次の使用例は、ページ全体を受信するまでブロックします。
#using <System.dll>
using namespace System;
using namespace System::Text;
using namespace System::IO;
using namespace System::Net;
using namespace System::Net::Sockets;
using namespace System::Collections;
Socket^ ConnectSocket( String^ server, int port )
{
Socket^ s = nullptr;
IPHostEntry^ hostEntry = nullptr;
// Get host related information.
hostEntry = Dns::Resolve( server );
// Loop through the AddressList to obtain the supported AddressFamily. This is to avoid
// an exception that occurs when the host IP Address is not compatible with the address family
// (typical in the IPv6 case).
IEnumerator^ myEnum = hostEntry->AddressList->GetEnumerator();
while ( myEnum->MoveNext() )
{
IPAddress^ address = safe_cast<IPAddress^>(myEnum->Current);
IPEndPoint^ endPoint = gcnew IPEndPoint( address,port );
Socket^ tmpS = gcnew Socket( endPoint->AddressFamily,SocketType::Stream,ProtocolType::Tcp );
tmpS->Connect( endPoint );
if ( tmpS->Connected )
{
s = tmpS;
break;
}
else
{
continue;
}
}
return s;
}
// This method requests the home page content for the specified server.
String^ SocketSendReceive( String^ server, int port )
{
String^ request = String::Concat( "GET / HTTP/1.1\r\nHost: ", server, "\r\nConnection: Close\r\n\r\n" );
array<Byte>^bytesSent = Encoding::ASCII->GetBytes( request );
array<Byte>^bytesReceived = gcnew array<Byte>(256);
String^ strRetPage = "";
// Create a socket connection with the specified server and port.
Socket^ s = ConnectSocket( server, port );
if ( s == nullptr )
return ("Connection failed");
// Send request to the server.
s->Send( bytesSent, bytesSent->Length, static_cast<SocketFlags>(0) );
// Receive the server home page content.
int bytes = 0;
strRetPage = String::Concat( "Default HTML page on ", server, ":\r\n" );
do
{
bytes = s->Receive( bytesReceived, bytesReceived->Length, static_cast<SocketFlags>(0) );
strRetPage = String::Concat( strRetPage, Encoding::ASCII->GetString( bytesReceived, 0, bytes ) );
}
while ( bytes > 0 );
s->Dispose();
return strRetPage;
}
int main()
{
array<String^>^args = Environment::GetCommandLineArgs();
String^ host;
int port = 80;
if ( args->Length == 1 )
// If no server name is passed as argument to this program,
// use the current host name as default.
host = Dns::GetHostName();
else
host = args[ 1 ];
String^ result = SocketSendReceive( host, port );
Console::WriteLine( result );
}
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;
// Get host related information.
hostEntry = Dns.GetHostEntry(server);
// Loop through the AddressList to obtain the supported AddressFamily. This is to avoid
// an exception that occurs when the host IP Address is not compatible with the address family
// (typical in the IPv6 case).
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;
}
// This method requests the home page content for the specified server.
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];
string page = "";
// Create a socket connection with the specified server and port.
using(Socket s = ConnectSocket(server, port)) {
if (s == null)
return ("Connection failed");
// Send request to the server.
s.Send(bytesSent, bytesSent.Length, 0);
// Receive the server home page content.
int bytes = 0;
page = "Default HTML page on " + server + ":\r\n";
// The following will block until the page is transmitted.
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)
// If no server name is passed as argument to this program,
// use the current host name as the default.
host = Dns.GetHostName();
else
host = args[0];
string result = SocketSendReceive(host, port);
Console.WriteLine(result);
}
}
Imports System.Text
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
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
' Get host related information.
hostEntry = Dns.GetHostEntry(server)
' Loop through the AddressList to obtain the supported AddressFamily. This is to avoid
' an exception that occurs when the host host IP Address is not compatible with the address family
' (typical in the IPv6 case).
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
' This method requests the home page content for the specified server.
Private Shared Function SocketSendReceive(server As String, port As Integer) As String
'Set up variables and String to write to the server.
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 page As String = ""
' Create a socket connection with the specified server and port.
Dim s As Socket = ConnectSocket(server, port)
If s Is Nothing Then
Return "Connection failed"
End If
' Send request to the server.
s.Send(bytesSent, bytesSent.Length, 0)
' Receive the server home page content.
Dim bytes As Int32
' Read the first 256 bytes.
page = "Default HTML page on " + server + ":" + ControlChars.Cr + ControlChars.Lf
' The following will block until the page is transmitted.
Do
bytes = s.Receive(bytesReceived, bytesReceived.Length, 0)
page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes)
Loop While bytes > 0
Return page
End Function
'Entry point which delegates to C-style main Private Function
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
' If no server name is passed as argument to this program,
' use the current host name as default.
host = Dns.GetHostName()
Else
host = args(1)
End If
Dim result As String = SocketSendReceive(host, port)
Console.WriteLine(result)
End Sub
End Class
注釈
このクラスには Socket 、ネットワーク通信用の豊富なメソッドとプロパティのセットが用意されています。 この Socket クラスを使用すると、列挙に記載されている任意の通信プロトコルを使用して、同期データ転送と非同期データ転送の両方を ProtocolType 実行できます。
このクラスはSocket、非同期メソッドの.NET Framework名前付けパターンに従います。 たとえば、同期 Receive メソッドは非同期 BeginReceive メソッドと EndReceive メソッドに対応します。
実行中にアプリケーションで必要なスレッドが 1 つだけの場合は、同期操作モード用に設計された次のメソッドを使用します。
TCP などの接続指向プロトコルを使用している場合、サーバーはメソッドを使用して接続を Listen リッスンできます。 このメソッドは Accept 、受信した接続要求を処理し、リモート ホストとのデータ通信に使用できる a を返 Socket します。 返されたSocketメソッドをReceive呼び出すには、このメソッドをSend使用します。 ローカル IP アドレスとポート番号を Bind 指定する場合は、メソッドを呼び出す前にメソッドを呼び出 Listen します。 基になるサービス プロバイダーに空きポートを割り当てる場合は、ポート番号 0 を使用します。 リッスンしているホストに接続する場合は、メソッドを Connect 呼び出します。 データを通信するには、or Receive メソッドをSend呼び出します。
UDP などのコネクションレス プロトコルを使用している場合は、接続をリッスンする必要はまったくありません。 メソッドを ReceiveFrom 呼び出して、受信データグラムを受け入れます。 このメソッドを SendTo 使用して、リモート ホストにデータグラムを送信します。
実行中に個別のスレッドを使用して通信を処理するには、非同期操作モード用に設計された次のメソッドを使用します。
TCP などの接続指向プロトコルを使用している場合は、リッスンしているホストに接続するために 、BeginConnect、メソッドEndConnectを使用Socketします。 またはメソッドを BeginSend EndSend BeginReceive EndReceive 使用して、データを非同期的に通信します。 受信接続要求は、次を使用してBeginAcceptEndAccept処理できます。
UDP などのコネクションレス プロトコルを使用している場合は、データグラムの送受信やEndSendTo BeginReceiveFrom EndReceiveFromデータグラムの受信を行BeginSendToうことができます。
1 つのソケットに対して複数の非同期操作を実行する場合、それらが開始された順序で必ずしも完了するとは限りません。
データの送受信が完了したら、メソッドを Shutdown 使用して Socket. 呼び出した Shutdown後、メソッドを Close 呼び出して、に関連付けられているすべてのリソースを解放します Socket。
このSocketクラスを使用すると、メソッドを使用してSetSocketOption構成できますSocket。 メソッドを使用してこれらの設定を GetSocketOption 取得します。
注意
比較的単純なアプリケーションを記述していて、最大のパフォーマンスを必要としない場合は、使用することをTcpClient検討してください。 TcpListenerUdpClient これらのクラスは、通信に対するよりシンプルで使いやすいインターフェイスを Socket 提供します。
コンストラクター
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 によって使用されているすべてのリソースを解放します。 |
拡張メソッド
適用対象
スレッド セーフ
このクラスのインスタンスはスレッド セーフです。