Socket.BeginSendFile Метод

Определение

Выполняет асинхронную передачу файла на подключенный объект Socket.

Перегрузки

BeginSendFile(String, AsyncCallback, Object)

Отправляет файл fileName на подключенный объект Socket, используя флаг UseDefaultWorkerThread.

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

Выполняет асинхронную передачу файла и буферов данных на подключенный объект Socket.

BeginSendFile(String, AsyncCallback, Object)

Отправляет файл fileName на подключенный объект Socket, используя флаг 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

Параметры

fileName
String

Строка, содержащая путь и имя отправляемого файла. Этот параметр может иметь значение null.

callback
AsyncCallback

Делегат AsyncCallback.

state
Object

Объект, содержащий сведения о состоянии для этого запроса.

Возвращаемое значение

IAsyncResult

Объект IAsyncResult, который представляет асинхронную передачу.

Исключения

Объект Socket закрыт.

Сокет не подключен к удаленному узлу.

Файл fileName не найден.

платформа .NET Framework и .net 5 и более ранних версий: при попытке доступа к сокету произошла ошибка. См. ниже примeчания к данному разделу.

Примеры

В следующем примере кода создается и подключается сокет для асинхронного взаимодействия. Во-первых, файл "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-папок (" \ \ \ \шаред Directory \\myfile.txt "). Если файл не найден, FileNotFoundException возникает исключение.

этот метод использует TransmitFile функцию, найденную в API Windows sockets 2. дополнительные сведения о TransmitFile функции и ее флагах см. в документации по сокетам Windows .

BeginSendFileМетод запускает асинхронную операцию отправки на удаленный узел, установленный в Connect BeginConnect Accept методах,, или BeginAccept . BeginSendFile создает исключение, если не выполняется первый вызов Accept ,, BeginAccept Connect или BeginConnect . Вызов BeginSendFile метода позволяет отправить файл в отдельном потоке выполнения.

Чтобы завершить операцию, можно создать метод обратного вызова, который вызывается AsyncCallback параметром Delegate. Для этого, как минимум, state параметр должен содержать Socket объект, используемый для связи. Если для обратного вызова требуются дополнительные сведения, можно создать класс или структуру для хранения Socket и других необходимых сведений. Передайте экземпляр этого пользовательского объекта в BeginSendFile метод через state параметр.

Метод обратного вызова должен вызывать EndSendFile метод. Когда приложение вызывает BeginSendFile , система использует отдельный поток для выполнения указанного метода обратного вызова и блокируется EndSendFile до тех пор, пока не Socket отправит весь файл или не выдаст исключение. Дополнительные сведения о написании методов обратного вызова см. в разделе маршалирование делегата в качестве метода обратного вызова.

Хотя и предназначен для протоколов, ориентированных на подключение, BeginSendFile также работает для протоколов без подключения при условии, что сначала вызывается Connect метод или, BeginConnect чтобы установить удаленный узел по умолчанию. При использовании протоколов без подключения необходимо убедиться, что размер файла не превышает максимальный размер пакета поставщика услуг. Если это так, датаграмма не отправляется и BeginSendFile вызывает SocketException исключение.

Примечание

Если вы получаете SocketException исключение, используйте SocketException.ErrorCode свойство для получения конкретного кода ошибки. после получения этого кода ознакомьтесь с подробным описанием ошибки в документации по коду ошибки API Windows sockets версии 2 .

Примечание

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети. дополнительные сведения см. в разделе сетевая трассировка в платформа .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 и более ранних версий: при попытке доступа к сокету произошла ошибка. См. ниже примeчания к данному разделу.

Операционной системой не является 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-папок (" \ \ \ \шаред Directory \\myfile.txt "). Если файл не найден, FileNotFoundException возникает исключение.

flagsПараметр предоставляет поставщику услуг Windows Sockets дополнительные сведения о переносе файлов. Дополнительные сведения об использовании этого параметра см. в разделе TransmitFileOptions .

этот метод использует TransmitFile функцию, найденную в API Windows sockets 2. дополнительные сведения о TransmitFile функции и ее флагах см. в документации по сокетам Windows .

BeginSendFileМетод запускает асинхронную операцию отправки на удаленный узел, установленный в Connect BeginConnect Accept методах,, или BeginAccept . BeginSendFile создает исключение, если не выполняется первый вызов Accept ,, BeginAccept Connect или BeginConnect . Вызов BeginSendFile метода дает возможность отправить файл в отдельном потоке выполнения.

Чтобы завершить операцию, можно создать метод обратного вызова, который вызывается AsyncCallback параметром Delegate. Для этого, как минимум, state параметр должен содержать Socket объект, используемый для связи. Если для обратного вызова требуются дополнительные сведения, можно создать класс или структуру для хранения Socket и других необходимых сведений. Передайте экземпляр этого пользовательского объекта в BeginSendFile метод через state параметр.

Метод обратного вызова должен вызывать EndSendFile метод. Когда приложение вызывает BeginSendFile , система использует отдельный поток для выполнения указанного метода обратного вызова и блокируется EndSendFile до тех пор, пока не Socket отправит весь файл или не выдаст исключение. Дополнительные сведения о написании методов обратного вызова см. в разделе маршалирование делегата в качестве метода обратного вызова.

Хотя и предназначен для протоколов, ориентированных на подключение, BeginSendFile также работает для протоколов без подключения при условии, что сначала вызывается Connect метод или, BeginConnect чтобы установить удаленный узел по умолчанию. При использовании протоколов без подключения необходимо также убедиться в том, что размер файла не превышает максимальный размер пакета для базового поставщика услуг. Если это так, датаграмма не отправляется и BeginSendFile вызывает SocketException исключение.

Примечание

Если вы получаете SocketException исключение, используйте SocketException.ErrorCode свойство для получения конкретного кода ошибки. после получения этого кода ознакомьтесь с подробным описанием ошибки в документации по коду ошибки API Windows sockets версии 2 .

Примечание

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети. дополнительные сведения см. в разделе сетевая трассировка в платформа .NET Framework.

Примечание

Контекст выполнения (контекст безопасности, олицетворенный пользователь и вызывающий контекст) кэшируется для асинхронных Socket методов. После первого использования определенного контекста (определенного асинхронного Socket метода, конкретного Socket экземпляра и конкретного обратного вызова) при последующих применениях этого контекста будет отображаться улучшение производительности.

Применяется к