次の方法で共有


Socket.SendTo メソッド (Byte , Int32, Int32, SocketFlags, EndPoint)

指定した SocketFlags を使用し、指定したバイト数のデータを、指定したエンドポイントに送信します。送信はバッファ内の指定した位置から開始されます。

Overloads Public Function SendTo( _
   ByVal buffer() As Byte, _   ByVal offset As Integer, _   ByVal size As Integer, _   ByVal socketFlags As SocketFlags, _   ByVal remoteEP As EndPoint _) As Integer
[C#]
public int SendTo(byte[] buffer,intoffset,intsize,SocketFlagssocketFlags,EndPointremoteEP);
[C++]
public: int SendTo(unsigned charbuffer __gc[],intoffset,intsize,SocketFlagssocketFlags,EndPoint* remoteEP);
[JScript]
public function SendTo(
   buffer : Byte[],offset : int,size : int,socketFlags : SocketFlags,remoteEP : EndPoint) : int;

パラメータ

  • buffer
    送信するデータを格納する Byte 型の配列。
  • offset
    データの送信を開始する、データ バッファ内の位置。
  • size
    送信するバイト数。
  • socketFlags
    SocketFlags 値のビットごとの組み合わせ。
  • remoteEP
    データ送信先の位置を表している EndPoint

戻り値

送信されたバイト数。

例外

例外の種類 条件
ArgumentNullException buffer が null 参照 (Visual Basic では Nothing) です。

または

remoteEP が null 参照 (Nothing) です。

ArgumentOutOfRangeException offset が 0 未満です。

または

offsetbuffer の長さを超えています。

または

size が 0 未満です。

または

size が、 buffer の長さから offset パラメータの値を引いた値を超えています。

SocketException socketFlags が、値の有効な組み合わせではありません。

または

Socket にアクセス中にオペレーティング システム エラーが発生しました。詳細については、「解説」を参照してください。

ObjectDisposedException Socket は閉じられています。
SecurityException コール スタック内の呼び出し元が、要求されたアクセス許可を保持していません。

解説

このオーバーロードで、 DontRoute フラグを socketflags パラメータとして指定した場合、送信しようとしているデータはルーティングされません。 OutOfBand フラグを socketflags パラメータとして指定した場合、 Send は帯域外データだけを送信します。OOB データは、接続しているストリーム ソケットの各ペアに関連付けられる、論理的に独立した伝送チャネルです。このデータは、高い優先順位で、通常のデータとは独立して送信されます。

コネクションレスのプロトコルを使用している場合は、 SendTo を呼び出す前に Connect メソッドで既定のリモート ホストを確立する必要がありません。これは、 Send メソッドを呼び出す場合にだけ必要です。 SendTo を呼び出す前に Connect を呼び出した場合、 remoteEP パラメータはその送信操作でだけ指定した既定のリモート ホストをオーバーライドします。また、 Bind メソッドを呼び出す必要はありません。基になるサービス プロバイダが最も適切なローカル ネットワーク アドレスとポート番号を割り当てるためです。割り当てられたローカル ネットワーク アドレスおよびポート番号を特定する必要がある場合は、 SendTo メソッドが正常に終了した後に LocalEndPoint プロパティを使用できます。

SendTo は、コネクションレスのプロトコルを想定していますが、コネクション指向のプロトコルでも使用できます。コネクション指向のプロトコルを使用する場合は、 Connect を呼び出してリモート ホストとの接続を確立するか、 Accept を使用して受信接続を受け入れる必要があります。リモート ホストとの接続を確立していないか、受け入れていない場合は、 SendToSocketException をスローします。また、 SendTo を呼び出す前に、コネクションレス プロトコルで既定のリモート ホストを確立することもできます。いずれの場合も、 SendToremoteEP パラメータを無視し、接続されているリモート ホストまたは既定のリモート ホストにだけデータを送信します。

ブロッキング ソケットは、要求されたバイト数が送信されるまでブロックします。非ブロッキング Socket はすぐに完了するため、1 回の操作で要求されたバイトの一部が送信されない可能性があります。送信されたバイト数を監視し、要求されたバイト数をすべて送信するまで操作を再試行することは、アプリケーション側の責任です。また、送信したデータがすぐにネットワーク上に現れることは保証されません。ネットワークの効率を高めるため、基になっているシステムは、十分な量の送信データが収集されるまで送信を遅延することがあります。 SendTo メソッドが正常に完了した場合は、基になるシステムにネットワーク送信のためにデータをバッファする余地があったことを示します。すべてのバイトをリモート ホストにすぐに送信することがアプリケーションの重要な要件の場合は、 SetSocketOption を使用して SocketOptionName.NoDelay を有効にすることができます。ネットワーク効率を高めるためのバッファの詳細については、MSDN の Nagle アルゴリズムを参照してください。

コネクションレスのプロトコルをブロッキング モードで使用している場合、 SendTo はデータグラムが送信されるまでブロックします。データをブロードキャスト アドレスに送信する場合は、最初に SetSocketOption メソッドを呼び出し、ソケット オプションを SocketOptionName.Broadcast に設定する必要があります。また、サイズが、基になるサービス プロバイダの最大パケット サイズを超えないことを確認する必要もあります。その場合、データグラムは送信されず、 SendToSocketException をスローします。

メモ    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 SendTo4()
    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, 0, msg.Length, SocketFlags.None, endPoint)
    s.Close()
End Sub 'SendTo4



[C#] 
public static void SendTo4()
{
    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, 0, msg.Length, SocketFlags.None, endPoint);
    s.Close();
}


[C++] 
static void SendTo4()
{
    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, 0, 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