Socket.BeginSendFile Metoda

Definicja

Wysyła plik asynchronicznie do połączonego Socket obiektu.

Przeciążenia

BeginSendFile(String, AsyncCallback, Object)

Wysyła plik fileName do połączonego Socket obiektu przy użyciu flagi UseDefaultWorkerThread .

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

Wysyła plik i bufory danych asynchronicznie do połączonego Socket obiektu.

BeginSendFile(String, AsyncCallback, Object)

Wysyła plik fileName do połączonego Socket obiektu przy użyciu flagi UseDefaultWorkerThread .

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

Parametry

fileName
String

Ciąg zawierający ścieżkę i nazwę pliku do wysłania. Ten parametr może mieć wartość null.

callback
AsyncCallback

Delegat AsyncCallback .

state
Object

Obiekt zawierający informacje o stanie dla tego żądania.

Zwraca

IAsyncResult

IAsyncResult Obiekt reprezentujący wysyłanie asynchroniczne.

Wyjątki

Obiekt Socket został zamknięty.

Gniazdo nie jest połączone z hostem zdalnym.

Nie można odnaleźć pliku fileName .

.NET Framework i .NET 5 i starszych tylko: Wystąpił błąd podczas próby uzyskania dostępu do gniazda. Zobacz sekcję uwagi poniżej.

Przykłady

Poniższy przykład kodu tworzy i łączy gniazdo dla komunikacji asynchronicznej. Najpierw plik "text.txt" jest wysyłany asynchronicznie do hosta zdalnego. Wywołanie delegata wywołania zwrotnego EndSendFile w celu ukończenia transmisji.

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

Uwagi

To przeciążenie wysyła plik fileName do połączonego gniazda. Jeśli fileName znajduje się w katalogu lokalnym, może zostać zidentyfikowany przy użyciu tylko nazwy pliku. W przeciwnym razie należy określić pełną ścieżkę i nazwę pliku. Symbole wieloznaczne ("..\\myfile.txt") i nazwy udziałów UNC ("\\\\shared directory\\myfile.txt") są obsługiwane. Jeśli plik nie zostanie znaleziony, zostanie zgłoszony wyjątek FileNotFoundException .

Ta metoda używa TransmitFile funkcji znalezionej w interfejsie API Windows Sockets 2. Aby uzyskać więcej informacji na temat TransmitFile funkcji i jej flag, zobacz dokumentację Windows Sockets.

Metoda BeginSendFile uruchamia asynchroniczną operację wysyłania do hosta zdalnego ustanowionego Connectw metodach ,BeginConnectAccept , lub BeginAccept . BeginSendFilezgłasza wyjątek, jeśli nie wywołasz Acceptmetody , , BeginAcceptConnectlub BeginConnect. BeginSendFile Wywołanie metody umożliwia wysłanie pliku w osobnym wątku wykonywania.

Aby ukończyć operację, możesz utworzyć metodę wywołania zwrotnego wywoływaną przez parametr delegata AsyncCallback . Aby to zrobić, state w minimalnym przypadku parametr musi zawierać Socket obiekt używany do komunikacji. Jeśli wywołanie zwrotne wymaga dodatkowych informacji, możesz utworzyć klasę lub strukturę do przechowywania Socket i innych wymaganych informacji. Przekaż wystąpienie tego obiektu niestandardowego do BeginSendFile metody za pośrednictwem parametru state .

Metoda wywołania zwrotnego musi wywołać metodę EndSendFile . Gdy aplikacja wywołuje BeginSendFilemetodę , system używa oddzielnego wątku do wykonywania określonej metody wywołania zwrotnego i blokuje EndSendFile do momentu Socket wysłania całego pliku lub zgłoszenia wyjątku. Aby uzyskać dodatkowe informacje na temat pisania metod wywołania zwrotnego, zobacz Marshaling a Delegate as a Callback Method (Przeprowadzanie marshalingu delegata jako metoda wywołania zwrotnego).

Chociaż jest przeznaczony dla protokołów zorientowanych na połączenie, BeginSendFile działa również w przypadku protokołów bez połączenia, pod warunkiem, że najpierw wywołasz Connect metodę lub BeginConnect w celu ustanowienia domyślnego hosta zdalnego. W przypadku protokołów bez połączenia należy się upewnić, że rozmiar pliku nie przekracza maksymalnego rozmiaru pakietu bazowego dostawcy usług. Jeśli tak, datagram nie jest wysyłany i BeginSendFile zgłasza SocketException wyjątek.

Uwaga

Jeśli wystąpi SocketException wyjątek, użyj SocketException.ErrorCode właściwości , aby uzyskać określony kod błędu. Po uzyskaniu tego kodu zapoznaj się z dokumentacją kodu błędu interfejsu API Windows Sockets w wersji 2, aby uzyskać szczegółowy opis błędu.

Uwaga

Ten element członkowski generuje informacje ze śledzenia pod warunkiem włączenia funkcji śledzenia sieci w aplikacji. Aby uzyskać więcej informacji, zobacz Śledzenie sieci w .NET Framework.

Uwaga

Kontekst wykonywania (kontekst zabezpieczeń, personifikowany użytkownik i kontekst wywołujący) jest buforowany dla metod asynchronicznych Socket . Po pierwszym użyciu określonego kontekstu (konkretnej metody asynchronicznej Socket , określonego wystąpienia i określonego Socket wywołania zwrotnego), kolejne zastosowania tego kontekstu zobaczą poprawę wydajności.

Dotyczy

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

Wysyła plik i bufory danych asynchronicznie do połączonego Socket obiektu.

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

Parametry

fileName
String

Ciąg zawierający ścieżkę i nazwę pliku do wysłania. Ten parametr może mieć wartość null.

preBuffer
Byte[]

Dane do wysłania przed wysłaniem pliku. Ten parametr może mieć wartość null.

postBuffer
Byte[]

Dane do wysłania po wysłaniu pliku. Ten parametr może mieć wartość null.

flags
TransmitFileOptions

Bitowe połączenie wartości wyliczenia.

callback
AsyncCallback

Delegat AsyncCallback , który ma być wywoływany po zakończeniu tej operacji. Ten parametr może mieć wartość null.

state
Object

Obiekt zdefiniowany przez użytkownika, który zawiera informacje o stanie dla tego żądania. Ten parametr może mieć wartość null.

Zwraca

IAsyncResult

IAsyncResult Obiekt reprezentujący operację asynchroniczną.

Wyjątki

Obiekt Socket został zamknięty.

.NET Framework i .NET 5 i starszych tylko: Wystąpił błąd podczas próby uzyskania dostępu do gniazda. Zobacz sekcję uwagi poniżej.

System operacyjny nie jest Windows NT lub nowszy.

-lub-

Gniazdo nie jest połączone z hostem zdalnym.

Nie można odnaleźć pliku fileName .

Przykłady

Poniższy przykład kodu tworzy i łączy gniazdo dla komunikacji asynchronicznej i rozpoczyna wysyłanie pliku "text.txt" asynchronicznie do hosta zdalnego. W tym przykładzie jest tworzony element preBuffer i danych postBuffer do wysyłania za pomocą pliku, a wartość domyślna TransmitFileOptions jest używana. Wywołanie delegata wywołania zwrotnego EndSendFile w celu ukończenia transmisji.

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

Uwagi

To przeciążenie wymaga nazwy pliku, który chcesz wysłać, i bitowej kombinacji TransmitFileOptions wartości. Parametr preBuffer zawiera wszystkie dane, które chcesz poprzedzić plikiem. postBuffer zawiera dane, które mają być zgodne z plikiem. Jeśli fileName znajduje się w katalogu lokalnym, może zostać zidentyfikowany przy użyciu tylko nazwy pliku. W przeciwnym razie należy określić pełną ścieżkę i nazwę pliku. Symbole wieloznaczne ("..\\myfile.txt") i nazwy udziałów UNC ("\\\\shared directory\\myfile.txt") są obsługiwane. Jeśli plik nie zostanie znaleziony, zostanie zgłoszony wyjątek FileNotFoundException .

Parametr flags udostępnia dostawcę usługi Windows Sockets z dodatkowymi informacjami na temat transferu plików. Aby uzyskać więcej informacji na temat używania tego parametru, zobacz TransmitFileOptions.

Ta metoda używa TransmitFile funkcji znalezionej w interfejsie API Windows Sockets 2. Aby uzyskać więcej informacji na temat TransmitFile funkcji i jej flag, zobacz dokumentację Windows Sockets.

Metoda BeginSendFile uruchamia asynchroniczną operację wysyłania do hosta zdalnego ustanowionego Connectw metodach , BeginConnect, Acceptlub BeginAccept . BeginSendFilezgłasza wyjątek, jeśli nie wywołasz Acceptmetody , , BeginAcceptConnectlub BeginConnect. BeginSendFile Wywołanie metody umożliwia wysyłanie pliku w osobnym wątku wykonywania.

Aby ukończyć operację, możesz utworzyć metodę wywołania zwrotnego wywoływaną przez parametr delegata AsyncCallback . Aby to zrobić, state w minimalnym przypadku parametr musi zawierać Socket obiekt używany do komunikacji. Jeśli wywołanie zwrotne wymaga dodatkowych informacji, możesz utworzyć klasę lub strukturę do przechowywania Socket i innych wymaganych informacji. Przekaż wystąpienie tego obiektu niestandardowego do BeginSendFile metody za pośrednictwem parametru state .

Metoda wywołania zwrotnego musi wywołać metodę EndSendFile . Gdy aplikacja wywołuje BeginSendFilemetodę , system używa oddzielnego wątku do wykonywania określonej metody wywołania zwrotnego i blokuje EndSendFile do momentu Socket wysłania całego pliku lub zgłoszenia wyjątku. Aby uzyskać dodatkowe informacje na temat pisania metod wywołania zwrotnego, zobacz Marshaling a Delegate as a Callback Method (Przeprowadzanie marshalingu delegata jako metoda wywołania zwrotnego).

Chociaż jest przeznaczony dla protokołów zorientowanych na połączenie, BeginSendFile działa również w przypadku protokołów bez połączenia, pod warunkiem, że najpierw wywołasz Connect metodę lub BeginConnect w celu ustanowienia domyślnego hosta zdalnego. W przypadku protokołów bez połączenia należy również mieć pewność, że rozmiar pliku nie przekracza maksymalnego rozmiaru pakietu bazowego dostawcy usług. Jeśli tak, datagram nie jest wysyłany i BeginSendFile zgłasza SocketException wyjątek.

Uwaga

Jeśli wystąpi SocketException wyjątek, użyj SocketException.ErrorCode właściwości , aby uzyskać określony kod błędu. Po uzyskaniu tego kodu zapoznaj się z dokumentacją kodu błędu interfejsu API Windows Sockets w wersji 2, aby uzyskać szczegółowy opis błędu.

Uwaga

Ten element członkowski generuje informacje ze śledzenia pod warunkiem włączenia funkcji śledzenia sieci w aplikacji. Aby uzyskać więcej informacji, zobacz Śledzenie sieci w .NET Framework.

Uwaga

Kontekst wykonywania (kontekst zabezpieczeń, personifikowany użytkownik i kontekst wywołujący) jest buforowany dla metod asynchronicznych Socket . Po pierwszym użyciu określonego kontekstu (konkretnej metody asynchronicznej Socket , określonego wystąpienia i określonego Socket wywołania zwrotnego), kolejne zastosowania tego kontekstu zobaczą poprawę wydajności.

Dotyczy