Socket.BeginSendFile メソッド

定義

接続された Socket オブジェクトに、ファイルを非同期的に送信します。

オーバーロード

BeginSendFile(String, AsyncCallback, Object)

UseDefaultWorkerThread フラグを使用して、接続されている Socket オブジェクトにファイル fileName を送信します。

BeginSendFile(String, Byte[], Byte[], TransmitFileOptions, AsyncCallback, Object)

接続された Socket オブジェクトに、ファイルとデータのバッファーを非同期的に送信します。

BeginSendFile(String, AsyncCallback, Object)

UseDefaultWorkerThread フラグを使用して、接続されている Socket オブジェクトにファイル fileName を送信します。

public:
 IAsyncResult ^ BeginSendFile(System::String ^ fileName, AsyncCallback ^ callback, System::Object ^ state);
public IAsyncResult BeginSendFile (string fileName, AsyncCallback? callback, object? state);
public IAsyncResult BeginSendFile (string? fileName, AsyncCallback? callback, object? state);
public IAsyncResult BeginSendFile (string fileName, AsyncCallback callback, object state);
member this.BeginSendFile : string * AsyncCallback * obj -> IAsyncResult
Public Function BeginSendFile (fileName As String, callback As AsyncCallback, state As Object) As IAsyncResult

パラメーター

fileName
String

送信するファイルのパスと名前を格納する文字列。 このパラメーターは、null に設定できます。

callback
AsyncCallback

AsyncCallback デリゲート。

state
Object

この要求の状態情報を格納するオブジェクト。

戻り値

IAsyncResult

非同期送信を表す IAsyncResult オブジェクト。

例外

Socket オブジェクトは閉じられています。

ソケットがリモート ホストに接続されていません。

ファイル fileName が見つかりませんでした。

.NET Frameworkおよび .NET 5 以前のみ: ソケットにアクセスしようとしたときにエラーが発生しました。 以下の解説を参照してください。

次のコード例では、非同期通信用のソケットを作成して接続します。 まず、ファイル "text.txt" がリモート ホストに非同期的に送信されます。 コールバック デリゲートは、送信を完了するために呼び出します EndSendFile

   static void AsynchronousFileSend()
   {
      // Send a file to a remote device.
      // Establish the remote endpoint for the socket.
      IPHostEntry^ ipHostInfo = Dns::GetHostEntry( Dns::GetHostName() );
      IPAddress^ ipAddress = ipHostInfo->AddressList[ 0 ];
      IPEndPoint^ remoteEP = gcnew IPEndPoint( ipAddress,11000 );

      // Create a TCP/IP socket.
      Socket^ client = gcnew Socket( AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp );

      // Connect to the remote endpoint.
      client->BeginConnect( remoteEP, gcnew AsyncCallback( ConnectCallback ), client );

      // Wait for connect.
      connectDone->WaitOne();

      // There is a text file test.txt in the root directory.
      String^ fileName = "C:\\test.txt";

      // Send file fileName to the remote device.
      Console::WriteLine( fileName );
      client->BeginSendFile( fileName, gcnew AsyncCallback( FileSendCallback ), client );

      // Release the socket.
      client->Shutdown( SocketShutdown::Both );
      client->Close();
   }

private:
   static void FileSendCallback( IAsyncResult^ ar )
   {
      // Retrieve the socket from the state object.
      Socket^ client = dynamic_cast<Socket^>(ar->AsyncState);

      // Complete sending the data to the remote device.
      client->EndSendFile( ar );
      sendDone->Set();
   }
public static void AsynchronousFileSend()
{
    // Send a file to a remote device.

    // Establish the remote endpoint for the socket.
    IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);

    // Create a TCP/IP socket.
    Socket client = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp);

    // Connect to the remote endpoint.
    client.BeginConnect(remoteEP,
        new AsyncCallback(ConnectCallback), client);

    // Wait for connect.
    connectDone.WaitOne();

    // There is a text file test.txt in the root directory.
    string fileName = "C:\\test.txt";

    // Send file fileName to the remote device.
    Console.WriteLine(fileName);
    client.BeginSendFile(fileName, new AsyncCallback(FileSendCallback), client);

    // Release the socket.
    client.Shutdown(SocketShutdown.Both);
    client.Close();
}

private static void FileSendCallback(IAsyncResult ar)
{
    // Retrieve the socket from the state object.
    Socket client = (Socket) ar.AsyncState;

    // Complete sending the data to the remote device.
    client.EndSendFile(ar);
    sendDone.Set();
}

注釈

このオーバーロードは、接続されているソケットにファイル fileName を送信します。 ローカル ディレクトリ内にある場合 fileName は、ファイルの名前だけで識別できます。それ以外の場合は、ファイルの完全なパスと名前を指定する必要があります。 ワイルドカード ("..\\myfile.txt") と UNC 共有名 ("\\\\shared directory\\myfile.txt") がサポートされています。 ファイルが見つからない場合は、例外 FileNotFoundException がスローされます。

このメソッドでは、TransmitFileWindows Sockets 2 API で見つかった関数を使用します。 関数とそのフラグの詳細TransmitFileについては、Windows Sockets のドキュメントを参照してください。

メソッドはBeginSendFileAcceptBeginConnectまたはBeginAcceptメソッドで確立されたリモート ホストへの非同期送信操作をConnect開始します。 BeginSendFile最初に呼び出Acceptさない場合、BeginAcceptConnectまたは BeginConnect. メソッドを BeginSendFile 呼び出すと、別の実行スレッド内でファイルを送信できます。

操作を完了するには、デリゲート パラメーターによって呼び出されるコールバック メソッドを AsyncCallback 作成します。 これを行うには、少なくとも、通信に使用されるオブジェクトを state パラメーターに Socket 含める必要があります。 コールバックに詳細情報が必要な場合は、必要なその他の情報を保持 Socket するクラスまたは構造体を作成できます。 このカスタム オブジェクトのインスタンスをパラメーターを使用してメソッドにBeginSendFilestate渡します。

コールバック メソッドでメソッドを EndSendFile 呼び出す必要があります。 アプリケーションが呼び出BeginSendFileされると、システムは別のスレッドを使用して指定されたコールバック メソッドを実行し、ファイル全体をSocket送信するか例外をスローするまでブロックEndSendFileします。 コールバック メソッドの記述の詳細については、コールバック メソッド としてのデリゲートのマーシャリングに関するページを参照してください。

接続指向プロトコルを対象としていますが、BeginSendFile最初に or BeginConnect メソッドを呼び出Connectして既定のリモート ホストを確立する場合は、コネクションレス プロトコルでも機能します。 コネクションレス プロトコルでは、ファイルのサイズが基になるサービス プロバイダーの最大パケット サイズを超えないようにする必要があります。 その場合、データグラムは送信されず、 BeginSendFile 例外が SocketException スローされます。

注意

例外が発生した場合は SocketException 、プロパティを SocketException.ErrorCode 使用して特定のエラー コードを取得します。 このコードを取得したら、エラーの詳細な説明については、Windows Sockets バージョン 2 API エラー コードのドキュメントを参照してください。

注意

このメンバーは、アプリケーションでネットワーク トレースが有効にされている場合にトレース情報を出力します。 詳細については、「.NET Frameworkのネットワーク トレース」を参照してください。

注意

実行コンテキスト (セキュリティ コンテキスト、偽装されたユーザー、および呼び出し元のコンテキスト) は、非同期 Socket メソッド用にキャッシュされます。 特定のコンテキスト (特定の非同期 Socket メソッド、特定 Socket のインスタンス、および特定のコールバック) を最初に使用した後、そのコンテキストを後続で使用すると、パフォーマンスが向上します。

適用対象

BeginSendFile(String, Byte[], Byte[], TransmitFileOptions, AsyncCallback, Object)

接続された Socket オブジェクトに、ファイルとデータのバッファーを非同期的に送信します。

public:
 IAsyncResult ^ BeginSendFile(System::String ^ fileName, cli::array <System::Byte> ^ preBuffer, cli::array <System::Byte> ^ postBuffer, System::Net::Sockets::TransmitFileOptions flags, AsyncCallback ^ callback, System::Object ^ state);
public IAsyncResult BeginSendFile (string? fileName, byte[]? preBuffer, byte[]? postBuffer, System.Net.Sockets.TransmitFileOptions flags, AsyncCallback? callback, object? state);
public IAsyncResult BeginSendFile (string fileName, byte[] preBuffer, byte[] postBuffer, System.Net.Sockets.TransmitFileOptions flags, AsyncCallback callback, object state);
member this.BeginSendFile : string * byte[] * byte[] * System.Net.Sockets.TransmitFileOptions * AsyncCallback * obj -> IAsyncResult
Public Function BeginSendFile (fileName As String, preBuffer As Byte(), postBuffer As Byte(), flags As TransmitFileOptions, callback As AsyncCallback, state As Object) As IAsyncResult

パラメーター

fileName
String

送信されるファイルのパスと名前を格納する文字列。 このパラメーターは、null に設定できます。

preBuffer
Byte[]

ファイルが送信される前に送信されるデータ。 このパラメーターは、null に設定できます。

postBuffer
Byte[]

ファイルの送信後に送信されるデータ。 このパラメーターは、null に設定できます。

flags
TransmitFileOptions

列挙値のビットごとの組み合わせ。

callback
AsyncCallback

このオプションの完了時に呼び出される AsyncCallback デリゲート。 このパラメーターは、null に設定できます。

state
Object

この要求の状態情報を格納するユーザー定義のオブジェクト。 このパラメーターは、null に設定できます。

戻り値

IAsyncResult

非同期操作を表す IAsyncResult オブジェクト。

例外

Socket オブジェクトは閉じられています。

.NET Frameworkおよび .NET 5 以前のみ: ソケットにアクセスしようとしたときにエラーが発生しました。 以下の解説を参照してください。

オペレーティング システムは Windows NT 以降ではありません。

  • または -

ソケットがリモート ホストに接続されていません。

ファイル fileName が見つかりませんでした。

次のコード例では、非同期通信用のソケットを作成して接続し、"text.txt" ファイルのリモート ホストへの非同期送信を開始します。 この例では、 preBuffer ファイルと共に送信するデータと postBuffer 一部のデータが作成され、既定値 TransmitFileOptions が使用されます。 コールバック デリゲートは、送信を完了するために呼び出します EndSendFile

public:
   static void AsynchronousFileSendWithBuffers()
   {
      // Send a file asynchronously to the remote device. Send a buffer before the file and a buffer afterwards.
      // Establish the remote endpoint for the socket.
      IPHostEntry^ ipHostInfo = Dns::GetHostEntry( Dns::GetHostName() );
      IPAddress^ ipAddress = ipHostInfo->AddressList[ 0 ];
      IPEndPoint^ remoteEP = gcnew IPEndPoint( ipAddress,11000 );

      // Create a TCP/IP socket.
      Socket^ client = gcnew Socket( AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp );

      // Connect to the remote endpoint.
      client->BeginConnect( remoteEP, gcnew AsyncCallback( ConnectCallback ), client );

      // Wait for connect.
      connectDone->WaitOne();

      // Send a file fileName to the remote device with preBuffer and postBuffer data.
      // Create the preBuffer data.
      String^ string1 = String::Format( "This is text data that precedes the file.{0}", Environment::NewLine );
      array<Byte>^preBuf = Encoding::ASCII->GetBytes( string1 );

      // Create the postBuffer data.
      String^ string2 = String::Format( "This is text data that will follow the file.{0}", Environment::NewLine );
      array<Byte>^postBuf = Encoding::ASCII->GetBytes( string2 );

      // There is a file test.txt in the root directory.
      String^ fileName = "C:\\test.txt";

      //Send file fileName with buffers and default flags to the remote device.
      Console::WriteLine( fileName );
      client->BeginSendFile( fileName, preBuf, postBuf, static_cast<TransmitFileOptions>(0), gcnew AsyncCallback( AsynchronousFileSendCallback ), client );

      // Release the socket.
      client->Shutdown( SocketShutdown::Both );
      client->Close();
   }


private:
   static void AsynchronousFileSendCallback( IAsyncResult^ ar )
   {
      // Retrieve the socket from the state object.
      Socket^ client = dynamic_cast<Socket^>(ar->AsyncState);

      // Complete sending the data to the remote device.
      client->EndSendFile( ar );
      sendDone->Set();
   }
public static void AsynchronousFileSendWithBuffers()
{
    // Send a file asynchronously to the remote device. Send a buffer before the file and a buffer afterwards.

    // Establish the remote endpoint for the socket.
    IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);

    // Create a TCP/IP socket.
    Socket client = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp);

    // Connect to the remote endpoint.
    client.BeginConnect(remoteEP,
        new AsyncCallback(ConnectCallback), client);

    // Wait for connect.
    connectDone.WaitOne();

    // Send a file fileName to the remote device with preBuffer and postBuffer data.
    // Create the preBuffer data.
    string string1 = String.Format("This is text data that precedes the file.{0}", Environment.NewLine);
    byte[] preBuf = Encoding.ASCII.GetBytes(string1);

    // Create the postBuffer data.
    string string2 = String.Format("This is text data that will follow the file.{0}", Environment.NewLine);
    byte[] postBuf = Encoding.ASCII.GetBytes(string2);

    // There is a file test.txt in the root directory.
    string fileName = "C:\\test.txt";

    //Send file fileName with buffers and default flags to the remote device.
    Console.WriteLine(fileName);
    client.BeginSendFile(fileName, preBuf, postBuf, 0, new AsyncCallback(AsynchronousFileSendCallback), client);

    // Release the socket.
    client.Shutdown(SocketShutdown.Both);
    client.Close();
}

private static void AsynchronousFileSendCallback(IAsyncResult ar)
{
    // Retrieve the socket from the state object.
    Socket client = (Socket) ar.AsyncState;

    // Complete sending the data to the remote device.
    client.EndSendFile(ar);
    sendDone.Set();
}

注釈

このオーバーロードには、送信するファイルの名前とビットごとの値の TransmitFileOptions 組み合わせが必要です。 この preBuffer パラメーターには、ファイルの前に置くデータが含まれています。 postBuffer には、ファイルに従うデータが含まれています。 ローカル ディレクトリ内にある場合 fileName は、ファイルの名前だけで識別できます。それ以外の場合は、ファイルの完全なパスと名前を指定する必要があります。 ワイルドカード ("..\\myfile.txt") と UNC 共有名 ("\\\\shared directory\\myfile.txt") がサポートされています。 ファイルが見つからない場合は、例外 FileNotFoundException がスローされます。

このパラメーターは flags 、ファイル転送に関する追加情報を Window Sockets サービス プロバイダーに提供します。 このパラメーターの使用方法の詳細については、次を参照してください TransmitFileOptions

このメソッドでは、TransmitFileWindows Sockets 2 API で見つかった関数を使用します。 関数とそのフラグの詳細TransmitFileについては、Windows Sockets のドキュメントを参照してください。

メソッドはBeginSendFile、またはBeginAcceptメソッドでConnectBeginConnectAccept確立されたリモート ホストへの非同期送信操作を開始します。 BeginSendFile最初に呼び出Acceptさない場合、BeginAcceptConnectまたは BeginConnect. このメソッドを BeginSendFile 呼び出すと、別の実行スレッド内でファイルを送信できます。

操作を完了するには、デリゲート パラメーターによって呼び出されるコールバック メソッドを AsyncCallback 作成します。 これを行うには、少なくとも、通信に使用されるオブジェクトを state パラメーターに Socket 含める必要があります。 コールバックに詳細情報が必要な場合は、必要なその他の情報を保持 Socket するクラスまたは構造体を作成できます。 このカスタム オブジェクトのインスタンスをパラメーターを使用してメソッドにBeginSendFilestate渡します。

コールバック メソッドでメソッドを EndSendFile 呼び出す必要があります。 アプリケーションが呼び出BeginSendFileされると、システムは別のスレッドを使用して指定されたコールバック メソッドを実行し、ファイル全体をSocket送信するか例外をスローするまでブロックEndSendFileします。 コールバック メソッドの記述の詳細については、コールバック メソッド としてのデリゲートのマーシャリングに関するページを参照してください。

接続指向プロトコルを対象としていますが、BeginSendFile最初に or BeginConnect メソッドを呼び出Connectして既定のリモート ホストを確立する場合は、コネクションレス プロトコルでも機能します。 コネクションレス プロトコルでは、ファイルのサイズが基になるサービス プロバイダーの最大パケット サイズを超えないようにする必要もあります。 その場合、データグラムは送信されず、 BeginSendFile 例外が SocketException スローされます。

注意

例外が発生した場合は SocketException 、プロパティを SocketException.ErrorCode 使用して特定のエラー コードを取得します。 このコードを取得したら、エラーの詳細な説明については、Windows Sockets バージョン 2 API エラー コードのドキュメントを参照してください。

注意

このメンバーは、アプリケーションでネットワーク トレースが有効にされている場合にトレース情報を出力します。 詳細については、「.NET Frameworkのネットワーク トレース」を参照してください。

注意

実行コンテキスト (セキュリティ コンテキスト、偽装されたユーザー、および呼び出し元のコンテキスト) は、非同期 Socket メソッド用にキャッシュされます。 特定のコンテキスト (特定の非同期 Socket メソッド、特定 Socket のインスタンス、および特定のコールバック) を最初に使用した後、そのコンテキストを後続で使用すると、パフォーマンスが向上します。

適用対象