Socket.BeginSendFile Método

Definição

Envia um arquivo de forma assíncrona para um objeto Socket conectado.Sends a file asynchronously to a connected Socket object.

Sobrecargas

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

Envia um arquivo e buffers de dados de forma assíncrona para um objeto Socket conectado.Sends a file and buffers of data asynchronously to a connected Socket object.

BeginSendFile(String, AsyncCallback, Object)

Envia o arquivo fileName para um objeto Socket conectado usando o sinalizador UseDefaultWorkerThread.Sends the file fileName to a connected Socket object using the UseDefaultWorkerThread flag.

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

Envia um arquivo e buffers de dados de forma assíncrona para um objeto Socket conectado.Sends a file and buffers of data asynchronously to a connected Socket object.

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

Parâmetros

fileName
String

Uma cadeia de caracteres que contém o caminho e o nome do arquivo a ser enviado.A string that contains the path and name of the file to be sent. Esse parâmetro pode ser null.This parameter can be null.

preBuffer
Byte[]

Uma matriz Byte que contém dados a serem enviados antes de o arquivo ser enviado.A Byte array that contains data to be sent before the file is sent. Esse parâmetro pode ser null.This parameter can be null.

postBuffer
Byte[]

Uma matriz Byte que contém dados a serem enviados depois de o arquivo ser enviado.A Byte array that contains data to be sent after the file is sent. Esse parâmetro pode ser null.This parameter can be null.

flags
TransmitFileOptions

Uma combinação bit a bit dos valores TransmitFileOptions.A bitwise combination of TransmitFileOptions values.

callback
AsyncCallback

Um delegado AsyncCallback a ser invocado quando a operação for concluída.An AsyncCallback delegate to be invoked when this operation completes. Esse parâmetro pode ser null.This parameter can be null.

state
Object

Um objeto definido pelo usuário que contém informações de estado para essa solicitação.A user-defined object that contains state information for this request. Esse parâmetro pode ser null.This parameter can be null.

Retornos

IAsyncResult

Um objeto IAsyncResult que representa a operação assíncrona.An IAsyncResult object that represents the asynchronous operation.

Exceções

O objeto Socket foi fechado.The Socket object has been closed.

Ocorreu um erro ao tentar acessar o soquete.An error occurred when attempting to access the socket. Consulte a seção Comentários abaixo.See remarks section below.

O sistema operacional não é o Windows NT ou posterior.The operating system is not Windows NT or later.

- ou --or-

O soquete não está conectado a um host remoto.The socket is not connected to a remote host.

O arquivo fileName não foi encontrado.The file fileName was not found.

Exemplos

O exemplo de código a seguir cria e conecta um soquete para comunicação assíncrona e começa a enviar o arquivo "text.txt" de forma assíncrona ao host remoto.The following code example creates and connects a socket for asynchronous communication and begins sending the file "text.txt" asynchronously to the remote host. Neste exemplo, um preBuffer e um postBuffer de dados são criados para enviar com o arquivo e o valor padrão TransmitFileOptions é usado.In this example, a preBuffer and a postBuffer of data is created to send with the file and the default TransmitFileOptions value is used. O retorno de chamada delegue chamadas EndSendFile para concluir a transmissão.The callback delegate calls EndSendFile to complete the transmission.

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();
}

Comentários

Essa sobrecarga requer o nome do arquivo que você deseja enviar e uma combinação de valores de bit que seja TransmitFileOptions .This overload requires the name of the file you want to send and a bitwise combination of TransmitFileOptions values. O preBuffer parâmetro contém todos os dados que você deseja preceder o arquivo.The preBuffer parameter contains any data you want to precede the file. postBuffer contém os dados que você deseja que siga o arquivo.postBuffer contains data you want to follow the file. Se fileName estiver no diretório local, ele poderá ser identificado apenas com o nome do arquivo; caso contrário, o caminho completo e o nome do arquivo deverão ser especificados.If fileName is in the local directory, it may be identified with just the name of the file; otherwise, the full path and name of the file must be specified. Caracteres curinga (".. \\myfile.txt ") e os nomes de compartilhamento UNC (" \ \ \ \Shared Directory \\myfile.txt ") têm suporte.Wildcards ("..\\myfile.txt") and UNC share names ("\\\\shared directory\\myfile.txt") are supported. Se o arquivo não for encontrado, a exceção FileNotFoundException será lançada.If the file is not found, the exception FileNotFoundException is thrown.

O flags parâmetro fornece o provedor de serviços do Window Sockets com informações adicionais sobre a transferência de arquivos.The flags parameter provides the Window Sockets service provider with additional information about the file transfer. Para obter mais informações sobre como usar esse parâmetro, consulte TransmitFileOptions .For more information about how to use this parameter, see TransmitFileOptions.

Esse método usa a TransmitFile função encontrada na API do Windows Sockets 2.This method uses the TransmitFile function found in the Windows Sockets 2 API. Para obter mais informações sobre a TransmitFile função e seus sinalizadores, consulte a documentação do Windows Sockets .For more information about the TransmitFile function and its flags, see the Windows Sockets documentation.

O BeginSendFile método inicia uma operação de envio assíncrona para o host remoto estabelecido Connect nos BeginConnect métodos,, Accept ou BeginAccept .The BeginSendFile method starts an asynchronous send operation to the remote host established in the Connect, BeginConnect, Accept, or BeginAccept methods. BeginSendFile gera uma exceção se você não chamar primeiro Accept , BeginAccept , Connect ou BeginConnect .BeginSendFile throws an exception if you do not first call Accept, BeginAccept, Connect, or BeginConnect. Chamar o BeginSendFile método lhe dá a capacidade de enviar um arquivo dentro de um thread de execução separado.Calling the BeginSendFile method gives you the ability to send a file within a separate execution thread.

Para concluir a operação, você pode criar um método de retorno de chamada que é invocado pelo AsyncCallback parâmetro delegate.To complete the operation, you can create a callback method that is invoked by the AsyncCallback delegate parameter. Para fazer isso, no mínimo, o state parâmetro deve conter o Socket objeto que está sendo usado para comunicação.To do this, at the very minimum, the state parameter must contain the Socket object being used for communication. Se o retorno de chamada precisar de mais informações, você poderá criar uma classe ou estrutura para manter o Socket e as outras informações necessárias.If your callback needs more information, you can create a class or structure to hold the Socket and the other required information. Passe uma instância desse objeto personalizado para o BeginSendFile método por meio do state parâmetro.Pass an instance of this custom object to the BeginSendFile method through the state parameter.

O método de retorno de chamada deve invocar o EndSendFile método.Your callback method must invoke the EndSendFile method. Quando seu aplicativo chama BeginSendFile , o sistema usa um thread separado para executar o método de retorno de chamada especificado e bloqueia EndSendFile até que o Socket envie o arquivo inteiro ou gere uma exceção.When your application calls BeginSendFile, the system uses a separate thread to execute the specified callback method, and blocks on EndSendFile until the Socket sends the entire file or throws an exception. Para obter informações adicionais sobre como escrever métodos de retorno de chamada , consulte Empacotando um delegado como um método de retorno de chamada.For additional information on writing callback methods see Marshaling a Delegate as a Callback Method.

Embora seja destinado a protocolos orientados a conexões, BeginSendFile o também funciona para protocolos sem conexão, desde que você primeiro chame o Connect BeginConnect método ou para estabelecer um host remoto padrão.Although intended for connection-oriented protocols, BeginSendFile also works for connectionless protocols, provided that you first call the Connect or BeginConnect method to establish a default remote host. Com protocolos sem conexão, você também deve ter certeza de que o tamanho do arquivo não excede o tamanho máximo do pacote do provedor de serviços subjacente.With connectionless protocols, you must also be sure that the size of your file does not exceed the maximum packet size of the underlying service provider. Se tiver, o datagrama não será enviado e BeginSendFile lançará uma SocketException exceção.If it does, the datagram is not sent and BeginSendFile throws a SocketException exception.

Observação

Se você receber uma SocketException exceção, use a SocketException.ErrorCode propriedade para obter o código de erro específico.If you receive a SocketException exception, use the SocketException.ErrorCode property to obtain the specific error code. Depois de obter esse código, consulte a documentação do código de erro da API do Windows Sockets versão 2 para obter uma descrição detalhada do erro.After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Observação

Esse membro emite o rastreamento de informações quando você ativa o rastreamento de rede em seu aplicativo.This member outputs trace information when you enable network tracing in your application. Para obter mais informações, consulte rastreamento de rede na .NET Framework.For more information, see Network Tracing in the .NET Framework.

Observação

O contexto de execução (o contexto de segurança, o usuário representado e o contexto de chamada) é armazenado em cache para os métodos assíncronos Socket .The execution context (the security context, the impersonated user, and the calling context) is cached for the asynchronous Socket methods. Após o primeiro uso de um contexto específico (um método assíncrono específico Socket , uma Socket instância específica e um retorno de chamada específico), os usos subsequentes desse contexto verão uma melhoria no desempenho.After the first use of a particular context (a specific asynchronous Socket method, a specific Socket instance, and a specific callback), subsequent uses of that context will see a performance improvement.

Aplica-se a

BeginSendFile(String, AsyncCallback, Object)

Envia o arquivo fileName para um objeto Socket conectado usando o sinalizador UseDefaultWorkerThread.Sends the file fileName to a connected Socket object using the UseDefaultWorkerThread flag.

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);
member this.BeginSendFile : string * AsyncCallback * obj -> IAsyncResult
Public Function BeginSendFile (fileName As String, callback As AsyncCallback, state As Object) As IAsyncResult

Parâmetros

fileName
String

Uma cadeia de caracteres que contém o caminho e o nome do arquivo a ser enviado.A string that contains the path and name of the file to send. Esse parâmetro pode ser null.This parameter can be null.

callback
AsyncCallback

O delegado AsyncCallback.The AsyncCallback delegate.

state
Object

Um objeto que contém informações de estado para essa solicitação.An object that contains state information for this request.

Retornos

IAsyncResult

Um objeto IAsyncResult que representa o envio assíncrono.An IAsyncResult object that represents the asynchronous send.

Exceções

O objeto Socket foi fechado.The Socket object has been closed.

O soquete não está conectado a um host remoto.The socket is not connected to a remote host.

O arquivo fileName não foi encontrado.The file fileName was not found.

Ocorreu um erro ao tentar acessar o soquete.An error occurred when attempting to access the socket. Consulte a seção Comentários abaixo.See remarks section below.

Exemplos

O exemplo de código a seguir cria e conecta um soquete para comunicação assíncrona.The following code example creates and connects a socket for asynchronous communication. Primeiro, o arquivo "text.txt" é enviado de forma assíncrona ao host remoto.First, the file "text.txt" is sent asynchronously to the remote host. O retorno de chamada delegue chamadas EndSendFile para concluir a transmissão.The callback delegate calls EndSendFile to complete the transmission.

   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();
}

Comentários

Essa sobrecarga envia o arquivo fileName para o Soquete conectado.This overload sends the file fileName to the connected socket. Se fileName estiver no diretório local, ele poderá ser identificado apenas com o nome do arquivo; caso contrário, o caminho completo e o nome do arquivo deverão ser especificados.If fileName is in the local directory, it may be identified with just the name of the file; otherwise, the full path and name of the file must be specified. Caracteres curinga (".. \\myfile.txt ") e os nomes de compartilhamento UNC (" \ \ \ \Shared Directory \\myfile.txt ") têm suporte.Wildcards ("..\\myfile.txt") and UNC share names ("\\\\shared directory\\myfile.txt") are supported. Se o arquivo não for encontrado, a exceção FileNotFoundException será lançada.If the file is not found, the exception FileNotFoundException is thrown.

Esse método usa a TransmitFile função encontrada na API do Windows Sockets 2.This method uses the TransmitFile function found in the Windows Sockets 2 API. Para obter mais informações sobre a TransmitFile função e seus sinalizadores, consulte a documentação do Windows Sockets .For more information about the TransmitFile function and its flags, see the Windows Sockets documentation.

O BeginSendFile método inicia uma operação de envio assíncrona para o host remoto estabelecido Connect nos BeginConnect métodos,, Accept ou BeginAccept .The BeginSendFile method starts an asynchronous send operation to the remote host established in the Connect,BeginConnect, Accept, or BeginAccept methods. BeginSendFile gera uma exceção se você não chamar primeiro Accept , BeginAccept , Connect ou BeginConnect .BeginSendFile throws an exception if you do not first call Accept, BeginAccept, Connect, or BeginConnect. Chamar o BeginSendFile método permite que você envie um arquivo dentro de um thread de execução separado.Calling the BeginSendFile method enables you to send a file within a separate execution thread.

Para concluir a operação, você pode criar um método de retorno de chamada que é invocado pelo AsyncCallback parâmetro delegate.To complete the operation, you can create a callback method that is invoked by the AsyncCallback delegate parameter. Para fazer isso, no mínimo, o state parâmetro deve conter o Socket objeto que está sendo usado para comunicação.To do this, at the very minimum, the state parameter must contain the Socket object being used for communication. Se o retorno de chamada precisar de mais informações, você poderá criar uma classe ou estrutura para manter o Socket e as outras informações necessárias.If your callback needs more information, you can create a class or structure to hold the Socket and the other required information. Passe uma instância desse objeto personalizado para o BeginSendFile método por meio do state parâmetro.Pass an instance of this custom object to the BeginSendFile method through the state parameter.

O método de retorno de chamada deve invocar o EndSendFile método.Your callback method must invoke the EndSendFile method. Quando seu aplicativo chama BeginSendFile , o sistema usa um thread separado para executar o método de retorno de chamada especificado e bloqueia EndSendFile até que o Socket envie o arquivo inteiro ou gere uma exceção.When your application calls BeginSendFile, the system uses a separate thread to execute the specified callback method, and blocks on EndSendFile until the Socket sends the entire file or throws an exception. Para obter informações adicionais sobre como escrever métodos de retorno de chamada , consulte Empacotando um delegado como um método de retorno de chamada.For additional information on writing callback methods see Marshaling a Delegate as a Callback Method.

Embora seja destinado a protocolos orientados a conexões, BeginSendFile o também funciona para protocolos sem conexão, desde que você primeiro chame o Connect BeginConnect método ou para estabelecer um host remoto padrão.Although intended for connection-oriented protocols, BeginSendFile also works for connectionless protocols, provided that you first call the Connect or BeginConnect method to establish a default remote host. Com protocolos sem conexão, você deve ter certeza de que o tamanho do arquivo não exceda o tamanho máximo do pacote do provedor de serviços subjacente.With connectionless protocols, you must be sure that the size of your file does not exceed the maximum packet size of the underlying service provider. Se tiver, o datagrama não será enviado e BeginSendFile lançará uma SocketException exceção.If it does, the datagram is not sent and BeginSendFile throws a SocketException exception.

Observação

Se você receber uma SocketException exceção, use a SocketException.ErrorCode propriedade para obter o código de erro específico.If you receive a SocketException exception, use the SocketException.ErrorCode property to obtain the specific error code. Depois de obter esse código, consulte a documentação do código de erro da API do Windows Sockets versão 2 para obter uma descrição detalhada do erro.After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Observação

Esse membro emite o rastreamento de informações quando você ativa o rastreamento de rede em seu aplicativo.This member outputs trace information when you enable network tracing in your application. Para obter mais informações, consulte rastreamento de rede na .NET Framework.For more information, see Network Tracing in the .NET Framework.

Observação

O contexto de execução (o contexto de segurança, o usuário representado e o contexto de chamada) é armazenado em cache para os métodos assíncronos Socket .The execution context (the security context, the impersonated user, and the calling context) is cached for the asynchronous Socket methods. Após o primeiro uso de um contexto específico (um método assíncrono específico Socket , uma Socket instância específica e um retorno de chamada específico), os usos subsequentes desse contexto verão uma melhoria no desempenho.After the first use of a particular context (a specific asynchronous Socket method, a specific Socket instance, and a specific callback), subsequent uses of that context will see a performance improvement.

Aplica-se a