Socket.SendTo メソッド (Byte , Int32, SocketFlags, EndPoint)
指定した SocketFlags を使用し、指定したバイト数のデータを、指定したエンドポイントに送信します。
Overloads Public Function SendTo( _
ByVal buffer() As Byte, _ ByVal size As Integer, _ ByVal socketFlags As SocketFlags, _ ByVal remoteEP As EndPoint _) As Integer
[C#]
public int SendTo(byte[] buffer,intsize,SocketFlagssocketFlags,EndPointremoteEP);
[C++]
public: int SendTo(unsigned charbuffer __gc[],intsize,SocketFlagssocketFlags,EndPoint* remoteEP);
[JScript]
public function SendTo(
buffer : Byte[],size : int,socketFlags : SocketFlags,remoteEP : EndPoint) : int;
パラメータ
- buffer
送信するデータを格納する Byte 型の配列。 - size
送信するバイト数。 - socketFlags
SocketFlags 値のビットごとの組み合わせ。 - remoteEP
データ送信先の位置を表している EndPoint 。
戻り値
送信されたバイト数。
例外
例外の種類 | 条件 |
---|---|
ArgumentNullException | buffer が null 参照 (Visual Basic では Nothing) です。
または remoteEP が null 参照 (Nothing) です。 |
ArgumentOutOfRangeException | 指定した size が buffer のサイズを超えています。 |
SocketException | ソケットへのアクセスを試みているときにエラーが発生しました。詳細については、「解説」を参照してください。 |
ObjectDisposedException | Socket は閉じられています。 |
解説
このオーバーロードでは、バッファのオフセットの既定値は 0 です。 DontRoute フラグを socketflags パラメータとして指定した場合、送信しようとしているデータはルーティングされません。 OutOfBand フラグを socketflags パラメータとして指定した場合、 Send は帯域外データだけを送信します。OOB データは、接続しているストリーム ソケットの各ペアに関連付けられる、論理的に独立した伝送チャネルです。このデータは、高い優先順位で、通常のデータとは独立して送信されます。
コネクションレスのプロトコルを使用している場合は、 SendTo を呼び出す前に Connect メソッドで既定のリモート ホストを確立する必要がありません。これは、 Send メソッドを呼び出す場合にだけ必要です。 SendTo を呼び出す前に Connect を呼び出した場合、 remoteEP パラメータはその送信操作でだけ指定した既定のリモート ホストをオーバーライドします。また、 Bind メソッドを呼び出す必要はありません。基になるサービス プロバイダが最も適切なローカル ネットワーク アドレスとポート番号を割り当てるためです。割り当てられたローカル ネットワーク アドレスおよびポート番号を特定する必要がある場合は、 SendTo メソッドが正常に終了した後に LocalEndPoint プロパティを使用できます。
SendTo は、コネクションレスのプロトコルを想定していますが、コネクション指向のプロトコルでも使用できます。コネクション指向のプロトコルを使用する場合は、 Connect を呼び出してリモート ホストとの接続を確立するか、 Accept を使用して受信接続を受け入れる必要があります。リモート ホストとの接続を確立していないか、受け入れていない場合は、 SendTo が SocketException をスローします。また、 SendTo を呼び出す前に、コネクションレス プロトコルで既定のリモート ホストを確立することもできます。いずれの場合も、 SendTo は remoteEP パラメータを無視し、接続されているリモート ホストまたは既定のリモート ホストにだけデータを送信します。
ブロッキング ソケットは、要求されたバイト数が送信されるまでブロックします。非ブロッキング Socket はすぐに完了するため、1 回の操作では要求されたバイトの一部が送信されない可能性があります。送信されたバイト数を監視し、要求されたバイト数をすべて送信するまで操作を再試行することは、アプリケーション側の責任です。また、送信したデータがすぐにネットワーク上に現れることは保証されません。ネットワークの効率を高めるため、基になっているシステムは、十分な量の送信データが収集されるまで送信を遅延することがあります。 SendTo メソッドが正常に完了した場合は、基になるシステムにネットワーク送信のためにデータをバッファする余地があったことを示します。すべてのバイトをリモート ホストにすぐに送信することがアプリケーションの重要な要件の場合は、 SetSocketOption を使用して SocketOptionName.NoDelay を有効にすることができます。ネットワーク効率を高めるためのバッファの詳細については、MSDN の Nagle アルゴリズムを参照してください。
コネクションレスのプロトコルをブロッキング モードで使用している場合、 SendTo はデータグラムが送信されるまでブロックします。データをブロードキャスト アドレスに送信する場合は、最初に SetSocketOption メソッドを呼び出し、ソケット オプションを SocketOptionName.Broadcast に設定する必要があります。また、送信するバイト数が、基になるサービス プロバイダの最大パケット サイズを超えないことを確認する必要があります。その場合、データグラムは送信されず、 SendTo は SocketException をスローします。
メモ SocketException が発生した場合は、 SocketException.ErrorCode を使用して具体的なエラー コードを取得してください。このコードを取得したら、Windows Socket Version 2 API エラー コードのマニュアルから、エラーの詳細情報を確認できます。これは MSDN から入手できます。
.NET Compact Framework - Windows CE .NET プラットフォームに関する注意点: このメソッドで長さ 0 のデータを送信した場合の結果は、.NET Compact Framework ではなく、ネイティブ オペレーティング システムによって決まります。
使用例
[Visual Basic, C#, C++] 指定したリモート ホストに、コネクションレスのデータグラムを送信する例を次に示します。サイズと SocketFlags は SendTo メソッドに渡されます。
Public Shared Sub SendTo3()
Dim hostEntry As IPHostEntry = Dns.Resolve(Dns.GetHostName())
Dim endPoint As New IPEndPoint(hostEntry.AddressList(0), 11000)
Dim s As New Socket(endPoint.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp)
Dim msg As Byte() = Encoding.ASCII.GetBytes("This is a test")
Console.WriteLine("Sending data.")
' This call blocks.
s.SendTo(msg, msg.Length, SocketFlags.None, endPoint)
s.Close()
End Sub 'SendTo3
[C#]
public static void SendTo3()
{
IPHostEntry hostEntry = Dns.Resolve(Dns.GetHostName());
IPEndPoint endPoint = new IPEndPoint(hostEntry.AddressList[0], 11000);
Socket s = new Socket(endPoint.Address.AddressFamily,
SocketType.Dgram,
ProtocolType.Udp);
byte[] msg = Encoding.ASCII.GetBytes("This is a test");
Console.WriteLine("Sending data.");
// This call blocks.
s.SendTo(msg, msg.Length, SocketFlags.None, endPoint);
s.Close();
}
[C++]
static void SendTo3()
{
IPHostEntry* hostEntry = Dns::Resolve(Dns::GetHostName());
IPEndPoint* endPoint = new IPEndPoint(hostEntry->AddressList[0], 11000);
Socket* s = new Socket(endPoint->Address->AddressFamily,
SocketType::Dgram,
ProtocolType::Udp);
Byte msg[]= Encoding::ASCII->GetBytes(S"This is a test");
Console::WriteLine(S"Sending data.");
// This call blocks.
s->SendTo(msg, msg.Length, SocketFlags::None, endPoint);
s->Close();
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET, Common Language Infrastructure (CLI) Standard
参照
Socket クラス | Socket メンバ | System.Net.Sockets 名前空間 | Socket.SendTo オーバーロードの一覧 | Connect | Bind | Send | SendTo | SetSocketOption | LocalEndPoint