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 未満です。
または offset が buffer の長さを超えています。 または size が 0 未満です。 または size が、 buffer の長さから offset パラメータの値を引いた値を超えています。 |
ObjectDisposedException | Socket は閉じられています。 |
SecurityException | コール スタックの上位にある呼び出し元が、要求された操作のアクセス許可を保持していません。 |
解説
BeginSendTo メソッドは、 remoteEP パラメータで指定されたリモート ホストへの非同期送信操作を開始します。 BeginSendTo メソッドを呼び出すと、個別の実行スレッド内でデータを送信できます。 BeginSendTo は、コネクションレスのプロトコルを想定していますが、コネクションレスのプロトコルとコネクション指向のプロトコルの両方で使用できます。
AsyncCallback デリゲートを実装するコールバック メソッドを作成し、その名前を BeginSendTo メソッドに渡すことができます。これを行うには、最低限、通信に使用される接続済みのまたは既定の Socket が state パラメータに含まれている必要があります。他の情報がコールバックに必要な場合は、小さなクラスを作成して Socket などの必要な情報を保持します。このクラスのインスタンスは、 state パラメータを使用して BeginSendTo メソッドに渡します。
コールバック メソッドは EndSendTo メソッドを実装する必要があります。アプリケーションが BeginSendTo を呼び出すと、指定したコールバック メソッドが個別のスレッドを使用して実行され、 EndSendTo は、 Socket が要求バイト数を送信するか例外をスローするまでブロックします。 BeginSendTo メソッドを呼び出してから元のスレッドをブロックする場合は、 WaitHandle.WaitOne メソッドを使用します。元のスレッドの実行を継続させるには、コールバック メソッドで ManualResetEvent.Set を呼び出します。コールバック メソッドの記述に関する追加情報については、「 Callback のサンプル 」を参照してください。
コネクション指向のプロトコルを使用している場合は、最初に Connect 、 BeginConnect 、 Accept 、 BeginAccept のいずれかのメソッドを呼び出す必要があります。最初に呼び出さないと、 BeginSendTo は SocketException をスローします。 BeginSendTo は remoteEP パラメータを無視し、 Connect 、 BeginConnect 、 Accept 、 BeginAccept のいずれかのメソッドで確立された EndPoint にデータを送信します。
コネクションレスのプロトコルを使用している場合は、 SendTo を呼び出す前に Connect メソッドまたは BeginConnect メソッドで既定のリモート ホストを確立する必要はありません。これは、 BeginSend メソッドを呼び出す場合にだけ必要です。 SendTo を呼び出す前に Connect または BeginConnect を呼び出した場合、 remoteEP パラメータはその送信操作でだけ指定した既定のリモート ホストをオーバーライドします。また、 Bind メソッドを呼び出す必要もありません。この場合は、基になるサービス プロバイダが最も適切なローカル ネットワーク アドレスとポート番号を割り当てます。割り当てられたローカル ネットワーク アドレスおよびポート番号を特定する必要がある場合は、 EndSendTo メソッドが正常に終了した後に LocalEndPoint プロパティを使用できます。
データをブロードキャスト アドレスに送信する場合は、最初に SetSocketOption メソッドを呼び出し、ソケット オプションを SocketOptionName.Broadcast に設定する必要があります。また、バッファのサイズが、基になるサービス プロバイダの最大パケット サイズを超えないことを確認する必要もあります。最大サイズを超えている場合、データグラムは送信されず、 EndSendTo は SocketException をスローします。
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