次の方法で共有


Socket.BeginSendTo メソッド

特定のリモート ホストにデータを非同期的に送信します。

Public Function BeginSendTo( _
   ByVal buffer() As Byte, _   ByVal offset As Integer, _   ByVal size As Integer, _   ByVal socketFlags As SocketFlags, _   ByVal remoteEP As EndPoint, _   ByVal callback As AsyncCallback, _   ByVal state As Object _) As IAsyncResult
[C#]
public IAsyncResult BeginSendTo(byte[] buffer,intoffset,intsize,SocketFlagssocketFlags,EndPointremoteEP,AsyncCallbackcallback,objectstate);
[C++]
public: IAsyncResult* BeginSendTo(unsigned charbuffer __gc[],intoffset,intsize,SocketFlagssocketFlags,EndPoint* remoteEP,AsyncCallback* callback,Object* state);
[JScript]
public function BeginSendTo(
   buffer : Byte[],offset : int,size : int,socketFlags : SocketFlags,remoteEP : EndPoint,callback : AsyncCallback,state : Object) : IAsyncResult;

パラメータ

  • buffer
    送信するデータを格納する Byte 型の配列。
  • offset
    データ送信を開始する、 buffer 内の、インデックス番号が 0 から始まる位置。
  • size
    送信するバイト数。
  • socketFlags
    SocketFlags 値のビットごとの組み合わせ。
  • remoteEP
    リモート デバイスを表す EndPoint
  • callback
    AsyncCallback デリゲート。
  • state
    要求の状態情報を格納するオブジェクト。

戻り値

非同期の送信を参照する IAsyncResult

例外

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

または

remoteEP が null 参照 (Nothing) です。

SocketException ソケットへのアクセスを試みているときにエラーが発生しました。詳細については、「解説」を参照してください。
ArgumentOutOfRangeException offset が 0 未満です。

または

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

または

size が 0 未満です。

または

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

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

解説

BeginSendTo メソッドは、 remoteEP パラメータで指定されたリモート ホストへの非同期送信操作を開始します。 BeginSendTo メソッドを呼び出すと、個別の実行スレッド内でデータを送信できます。 BeginSendTo は、コネクションレスのプロトコルを想定していますが、コネクションレスのプロトコルとコネクション指向のプロトコルの両方で使用できます。

AsyncCallback デリゲートを実装するコールバック メソッドを作成し、その名前を BeginSendTo メソッドに渡すことができます。これを行うには、最低限、通信に使用される接続済みのまたは既定の Socketstate パラメータに含まれている必要があります。他の情報がコールバックに必要な場合は、小さなクラスを作成して Socket などの必要な情報を保持します。このクラスのインスタンスは、 state パラメータを使用して BeginSendTo メソッドに渡します。

コールバック メソッドは EndSendTo メソッドを実装する必要があります。アプリケーションが BeginSendTo を呼び出すと、指定したコールバック メソッドが個別のスレッドを使用して実行され、 EndSendTo は、 Socket が要求バイト数を送信するか例外をスローするまでブロックします。 BeginSendTo メソッドを呼び出してから元のスレッドをブロックする場合は、 WaitHandle.WaitOne メソッドを使用します。元のスレッドの実行を継続させるには、コールバック メソッドで ManualResetEvent.Set を呼び出します。コールバック メソッドの記述に関する追加情報については、「 Callback のサンプル 」を参照してください。

コネクション指向のプロトコルを使用している場合は、最初に ConnectBeginConnectAcceptBeginAccept のいずれかのメソッドを呼び出す必要があります。最初に呼び出さないと、 BeginSendToSocketException をスローします。 BeginSendToremoteEP パラメータを無視し、 ConnectBeginConnectAcceptBeginAccept のいずれかのメソッドで確立された EndPoint にデータを送信します。

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

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

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

メモ    SocketException が発生した場合は、 SocketException.ErrorCode を使用して具体的なエラー コードを取得してください。このコードを取得したら、Windows Socket Version 2 API エラー コードのマニュアルから、エラーの詳細情報を確認できます。これは MSDN から入手できます。

使用例

[Visual Basic, C#, C++] 指定したリモート ホストに、非同期的にデータを送信する例を次に示します。

 
Dim lipa As IPHostEntry = Dns.Resolve("host.contoso.com")
Dim lep As New IPEndPoint(lipa.AddressList(0), 11000)

Dim s As New Socket(lep.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp)
Try
   
   While True
      allDone.Reset()
      
      Dim buff As Byte() = Encoding.ASCII.GetBytes("This is a test")
      
      Console.WriteLine("Sending Message Now..")
      s.BeginSendTo(buff, 0, buff.Length, 0, lep, New AsyncCallback(AddressOf Async_Send_Receive.SendTo_Callback), s)
      
      allDone.WaitOne()
   End While
Catch e As Exception
   Console.WriteLine(e.ToString())
End Try
   End Sub 'SendTo

[C#] 
IPHostEntry lipa = Dns.Resolve("host.contoso.com");
IPEndPoint lep = new IPEndPoint(lipa.AddressList[0], 11000);

   Socket s = new Socket(lep.Address.AddressFamily,
                                  SocketType.Stream,
                                     ProtocolType.Tcp);
   try{
      
             while(true){
             allDone.Reset();

             byte[] buff = Encoding.ASCII.GetBytes("This is a test");
             
             Console.WriteLine("Sending Message Now..");
             s.BeginSendTo(buff, 0, buff.Length, 0, lep, new AsyncCallback(Async_Send_Receive.SendTo_Callback), s);

             allDone.WaitOne();
        }
   }
   catch (Exception e){
        Console.WriteLine(e.ToString());
   }

[C++] 
IPHostEntry* lipa = Dns::Resolve(S"host.contoso.com");
IPEndPoint* lep = new IPEndPoint(lipa->AddressList[0], 11000);

Socket* s = new Socket(lep->Address->AddressFamily,
    SocketType::Stream,
    ProtocolType::Tcp);

try {
    while(true){
        allDone->Reset();

        Byte buff[] = Encoding::ASCII->GetBytes(S"This is a test");

        Console::WriteLine(S"Sending Message Now..");
        AsyncCallback* pasync = new AsyncCallback(0, &Async_Send_Receive::SendTo_Callback);
        s->BeginSendTo(buff, 0, buff->Length, SocketFlags::None, lep,
            pasync, s);

        allDone->WaitOne();
    }
} catch (Exception* e) {
    Console::WriteLine(e);
}

[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 名前空間 | 非同期呼び出しの組み込み | Callback のサンプル | EndSendTo | AsyncCallback | Connect | LocalEndPoint | Broadcast | SetSocketOption