Socket.EndSend メソッド
保留中の非同期送信を終了します。
Public Function EndSend( _
ByVal asyncResult As IAsyncResult _) As Integer
[C#]
public int EndSend(IAsyncResultasyncResult);
[C++]
public: int EndSend(IAsyncResult* asyncResult);
[JScript]
public function EndSend(
asyncResult : IAsyncResult) : int;
パラメータ
- asyncResult
この非同期操作の状態情報を格納する IAsyncResult 。
戻り値
正常に終了した場合は Socket に送信したバイト数。それ以外の場合は無効な Socket エラー。
例外
例外の種類 | 条件 |
---|---|
ArgumentNullException | asyncResult が null 参照 (Visual Basic では Nothing) です。 |
ArgumentException | BeginSend メソッドへの呼び出しで asyncResult が返されませんでした。 |
InvalidOperationException | EndSend が、非同期の読み取りのために以前に呼び出されています。 |
SocketException | ソケットへのアクセスを試みているときにエラーが発生しました。詳細については「解説」を参照してください。 |
ObjectDisposedException | Socket は閉じられています。 |
解説
EndSend は、 BeginSend で開始された非同期送信操作を完了します。
BeginSend を呼び出す前に、 AsyncCallback デリゲートを実装するコールバック メソッドを作成する必要があります。このコールバック メソッドは個別のスレッドで実行され、 BeginSend の終了時に呼び出されます。コールバック メソッドは、 BeginSend メソッドからパラメータとして返された IAsyncResult を受け取る必要があります。
コールバック メソッド内では、 IAsyncResult パラメータの AsyncState メソッドを呼び出して送信 Socket を取得します。 Socket を取得したら、 EndSend メソッドを呼び出して送信操作を正常に完了し、送信されたバイト数を返すことができます。コネクションレスのプロトコルを使用している場合、 EndSend はデータグラムが送信されるまでブロックします。コネクション指向のプロトコルを使用している場合、 EndSend は、要求されたバイト数が送信されるまでブロックします。送信したデータがすぐにネットワーク上に現れることは保証されません。ネットワークの効率を高めるため、基になっているシステムは、十分な量の送信データが収集されるまで送信を遅延することがあります。 BeginSend メソッドが正常に完了した場合は、基になるシステムにネットワーク送信のためにデータをバッファする余地があったことを示します。すべてのバイトをリモート ホストにすぐに送信することがアプリケーションの重要な要件の場合は、 SetSocketOption を使用して SocketOptionName.NoDelay を有効にすることができます。ネットワーク効率を高めるためのバッファの詳細については、MSDN の Nagle アルゴリズムを参照してください。
メモ SocketException が発生した場合は、 SocketException.ErrorCode を使用して具体的なエラー コードを取得してください。このコードを取得したら、Windows Socket Version 2 API エラー コードのマニュアルから、エラーの詳細情報を確認できます。これは MSDN から入手できます。
使用例
[Visual Basic, C#, C++] 保留中の非同期送信を終了する例を次に示します。
Dim so As StateObject = CType(ar.AsyncState, StateObject)
Dim s As Socket = so.workSocket
Dim send As Integer = s.EndSend(ar)
Console.WriteLine(("The size of the message sent was :" + send.ToString()))
s.Close()
End Sub 'Send_Callback
[C#]
StateObject so = (StateObject) ar.AsyncState;
Socket s = so.workSocket;
int send = s.EndSend(ar);
Console.WriteLine("The size of the message sent was :" + send.ToString());
s.Close();
[C++]
StateObject* so = __try_cast<StateObject*>(ar->AsyncState);
Socket* s = so->workSocket;
int send = s->EndSend(ar);
Console::WriteLine(S"The size of the message sent was : {0}", __box(send));
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 名前空間 | 非同期呼び出しの組み込み | BeginSend | AsyncCallback | AsyncState | SetSocketOption | NoDelay