Socket.BeginSendFile Method

Definition

Выполняет асинхронную передачу файла на подключенный объект Socket.Sends a file asynchronously to a connected Socket object.

Overloads

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

Выполняет асинхронную передачу файла и буферов данных на подключенный объект Socket.Sends a file and buffers of data asynchronously to a connected Socket object.

BeginSendFile(String, AsyncCallback, Object)

Отправляет файл fileName на подключенный объект Socket, используя флаг UseDefaultWorkerThread.Sends the file fileName to a connected Socket object using the UseDefaultWorkerThread flag.

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

Выполняет асинхронную передачу файла и буферов данных на подключенный объект Socket.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);
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

Parameters

fileName
String

Строка, содержащая путь и имя отправляемого файла.A string that contains the path and name of the file to be sent. Этот параметр может иметь значение null.This parameter can be null.

preBuffer
Byte[]

Массив Byte, содержащий данные, отправляемые перед передачей файла.A Byte array that contains data to be sent before the file is sent. Этот параметр может иметь значение null.This parameter can be null.

postBuffer
Byte[]

Массив Byte, содержащий данные, отправляемые после передачи файла.A Byte array that contains data to be sent after the file is sent. Этот параметр может иметь значение null.This parameter can be null.

flags
TransmitFileOptions

Побитовое сочетание значений TransmitFileOptions.A bitwise combination of TransmitFileOptions values.

callback
AsyncCallback

Делегат AsyncCallback, который должен быть вызван, когда эта операция завершается.An AsyncCallback delegate to be invoked when this operation completes. Этот параметр может иметь значение null.This parameter can be null.

state
Object

Определенный пользователем объект, содержащий сведения о состоянии для этого запроса.A user-defined object that contains state information for this request. Этот параметр может иметь значение null.This parameter can be null.

Returns

IAsyncResult

Объект IAsyncResult, который ссылается на асинхронную операцию.An IAsyncResult object that represents the asynchronous operation.

Exceptions

Объект Socket закрыт.The Socket object has been closed.

Произошла ошибка при попытке доступа к сокету.An error occurred when attempting to access the socket. См. ниже примeчания к данному разделу.See remarks section below.

Операционной системой не является Windows NT или более поздняя версия.The operating system is not Windows NT or later.

-или--or-

Сокет не подключен к удаленному узлу.The socket is not connected to a remote host.

Файл fileName не найден.The file fileName was not found.

Examples

Следующий пример кода создает и подключает сокет для асинхронного взаимодействия и начинает асинхронно отправлять файл "Text. txt" на удаленный узел.The following code example creates and connects a socket for asynchronous communication and begins sending the file "text.txt" asynchronously to the remote host. В этом примере создается preBuffer и postBuffer данных для отправки с файлом и используется значение по умолчанию TransmitFileOptions.In this example, a preBuffer and a postBuffer of data is created to send with the file and the default TransmitFileOptions value is used. Делегат обратного вызова вызывает EndSendFile для завершения передачи.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();
}

Remarks

Для этой перегрузки требуется имя файла, который требуется отправить, и побитовое сочетание значений TransmitFileOptions.This overload requires the name of the file you want to send and a bitwise combination of TransmitFileOptions values. Параметр preBuffer содержит все данные, которые необходимо указать перед файлом.The preBuffer parameter contains any data you want to precede the file. postBuffer содержит данные, которые необходимо отслеживать в файле.postBuffer contains data you want to follow the file. Если fileName находится в локальном каталоге, он может быть идентифицирован только с именем файла; в противном случае необходимо указать полный путь и имя файла.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. Подстановочные знаки ("..\\ MyFile. txt ") и имена общих UNC-папок ("\\\\ общий каталог\\ MyFile. txt ") поддерживаются.Wildcards ("..\\myfile.txt") and UNC share names ("\\\\shared directory\\myfile.txt") are supported. Если файл не найден, вызывается исключение FileNotFoundException.If the file is not found, the exception FileNotFoundException is thrown.

Параметр flags предоставляет поставщику службы оконных сокетов дополнительные сведения о переносе файлов.The flags parameter provides the Window Sockets service provider with additional information about the file transfer. Дополнительные сведения об использовании этого параметра см. в разделе TransmitFileOptions.For more information about how to use this parameter, see TransmitFileOptions.

Этот метод использует функцию TransmitFile, которая находится в API Windows Sockets 2.This method uses the TransmitFile function found in the Windows Sockets 2 API. Дополнительные сведения о функции TransmitFile и ее флагах см. в документации по сокетам Windows .For more information about the TransmitFile function and its flags, see the Windows Sockets documentation.

Метод BeginSendFile запускает асинхронную операцию отправки на удаленный узел, установленный в методах Connect, BeginConnect, Acceptили BeginAccept.The BeginSendFile method starts an asynchronous send operation to the remote host established in the Connect, BeginConnect, Accept, or BeginAccept methods. BeginSendFile создает исключение, если не выполняется первый вызов Accept, BeginAccept, Connectили BeginConnect.BeginSendFile throws an exception if you do not first call Accept, BeginAccept, Connect, or BeginConnect. Вызов метода BeginSendFile дает возможность отправить файл в отдельном потоке выполнения.Calling the BeginSendFile method gives you the ability to send a file within a separate execution thread.

Чтобы завершить операцию, можно создать метод обратного вызова, вызываемый параметром делегата AsyncCallback.To complete the operation, you can create a callback method that is invoked by the AsyncCallback delegate parameter. Для этого, как минимум, параметр state должен содержать объект Socket, используемый для связи.To do this, at the very minimum, the state parameter must contain the Socket object being used for communication. Если для обратного вызова требуются дополнительные сведения, можно создать класс или структуру для хранения Socket и других необходимых сведений.If your callback needs more information, you can create a class or structure to hold the Socket and the other required information. Передайте экземпляр этого пользовательского объекта методу BeginSendFile с помощью параметра state.Pass an instance of this custom object to the BeginSendFile method through the state parameter.

Метод обратного вызова должен вызывать метод EndSendFile.Your callback method must invoke the EndSendFile method. Когда приложение вызывает BeginSendFile, система использует отдельный поток для выполнения указанного метода обратного вызова и блокируется на EndSendFile до тех пор, пока Socket не отправит весь файл или не выдаст исключение.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. Дополнительные сведения о написании методов обратного вызова см. в разделе маршалирование делегата в качестве метода обратного вызова.For additional information on writing callback methods see Marshaling a Delegate as a Callback Method.

Хотя для протоколов, ориентированных на соединение, BeginSendFile работает и для протоколов без подключения, при условии, что сначала вызывается метод Connect или BeginConnect, чтобы установить удаленный узел по умолчанию.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. При использовании протоколов без подключения необходимо также убедиться в том, что размер файла не превышает максимальный размер пакета для базового поставщика услуг.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. Если это так, датаграмма не отправляется, а BeginSendFile вызывает исключение SocketException.If it does, the datagram is not sent and BeginSendFile throws a SocketException exception.

Note

При получении исключения SocketException используйте свойство SocketException.ErrorCode для получения конкретного кода ошибки.If you receive a SocketException exception, use the SocketException.ErrorCode property to obtain the specific error code. После получения этого кода обратитесь к документации по коду ошибки API Windows Sockets версии 2 для получения подробного описания ошибки.After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Note

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети.This member outputs trace information when you enable network tracing in your application. Дополнительные сведения см. в разделе Сетевая трассировка в .NET Framework.For more information, see Network Tracing in the .NET Framework.

Note

Контекст выполнения (контекст безопасности, олицетворенный пользователь и вызывающий контекст) кэшируется для асинхронных Socket методов.The execution context (the security context, the impersonated user, and the calling context) is cached for the asynchronous Socket methods. После первого использования определенного контекста (определенного асинхронного метода Socket, определенного экземпляра Socket и конкретного обратного вызова), последующие применения этого контекста приводят к повышению производительности.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.

BeginSendFile(String, AsyncCallback, Object)

Отправляет файл fileName на подключенный объект Socket, используя флаг 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);
member this.BeginSendFile : string * AsyncCallback * obj -> IAsyncResult
Public Function BeginSendFile (fileName As String, callback As AsyncCallback, state As Object) As IAsyncResult

Parameters

fileName
String

Строка, содержащая путь и имя отправляемого файла.A string that contains the path and name of the file to send. Этот параметр может иметь значение null.This parameter can be null.

callback
AsyncCallback

Делегат AsyncCallback.The AsyncCallback delegate.

state
Object

object, содержащий сведения о состоянии для этого запроса.An object that contains state information for this request.

Returns

IAsyncResult

Объект IAsyncResult, который представляет асинхронную передачу.An IAsyncResult object that represents the asynchronous send.

Exceptions

Объект Socket закрыт.The Socket object has been closed.

Сокет не подключен к удаленному узлу.The socket is not connected to a remote host.

Файл fileName не найден.The file fileName was not found.

Произошла ошибка при попытке доступа к сокету.An error occurred when attempting to access the socket. См. ниже примeчания к данному разделу.See remarks section below.

Examples

В следующем примере кода создается и подключается сокет для асинхронного взаимодействия.The following code example creates and connects a socket for asynchronous communication. Сначала файл "Text. txt" отправляется асинхронно на удаленный узел.First, the file "text.txt" is sent asynchronously to the remote host. Делегат обратного вызова вызывает EndSendFile для завершения передачи.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();
}

Remarks

Эта перегрузка отправляет файл fileName подключенному сокету.This overload sends the file fileName to the connected socket. Если fileName находится в локальном каталоге, он может быть идентифицирован только с именем файла; в противном случае необходимо указать полный путь и имя файла.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. Подстановочные знаки ("..\\ MyFile. txt ") и имена общих UNC-папок ("\\\\ общий каталог\\ MyFile. txt ") поддерживаются.Wildcards ("..\\myfile.txt") and UNC share names ("\\\\shared directory\\myfile.txt") are supported. Если файл не найден, вызывается исключение FileNotFoundException.If the file is not found, the exception FileNotFoundException is thrown.

Этот метод использует функцию TransmitFile, которая находится в API Windows Sockets 2.This method uses the TransmitFile function found in the Windows Sockets 2 API. Дополнительные сведения о функции TransmitFile и ее флагах см. в документации по сокетам Windows .For more information about the TransmitFile function and its flags, see the Windows Sockets documentation.

Метод BeginSendFile запускает асинхронную операцию отправки на удаленный узел, установленный в методах Connect,BeginConnect, Acceptили BeginAccept.The BeginSendFile method starts an asynchronous send operation to the remote host established in the Connect,BeginConnect, Accept, or BeginAccept methods. BeginSendFile создает исключение, если не выполняется первый вызов Accept, BeginAccept, Connectили BeginConnect.BeginSendFile throws an exception if you do not first call Accept, BeginAccept, Connect, or BeginConnect. Вызов метода BeginSendFile позволяет отправить файл в отдельном потоке выполнения.Calling the BeginSendFile method enables you to send a file within a separate execution thread.

Чтобы завершить операцию, можно создать метод обратного вызова, вызываемый параметром делегата AsyncCallback.To complete the operation, you can create a callback method that is invoked by the AsyncCallback delegate parameter. Для этого, как минимум, параметр state должен содержать объект Socket, используемый для связи.To do this, at the very minimum, the state parameter must contain the Socket object being used for communication. Если для обратного вызова требуются дополнительные сведения, можно создать класс или структуру для хранения Socket и других необходимых сведений.If your callback needs more information, you can create a class or structure to hold the Socket and the other required information. Передайте экземпляр этого пользовательского объекта методу BeginSendFile с помощью параметра state.Pass an instance of this custom object to the BeginSendFile method through the state parameter.

Метод обратного вызова должен вызывать метод EndSendFile.Your callback method must invoke the EndSendFile method. Когда приложение вызывает BeginSendFile, система использует отдельный поток для выполнения указанного метода обратного вызова и блокируется на EndSendFile до тех пор, пока Socket не отправит весь файл или не выдаст исключение.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. Дополнительные сведения о написании методов обратного вызова см. в разделе маршалирование делегата в качестве метода обратного вызова.For additional information on writing callback methods see Marshaling a Delegate as a Callback Method.

Хотя для протоколов, ориентированных на соединение, BeginSendFile работает и для протоколов без подключения, при условии, что сначала вызывается метод Connect или BeginConnect, чтобы установить удаленный узел по умолчанию.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. При использовании протоколов без подключения необходимо убедиться, что размер файла не превышает максимальный размер пакета поставщика услуг.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. Если это так, датаграмма не отправляется, а BeginSendFile вызывает исключение SocketException.If it does, the datagram is not sent and BeginSendFile throws a SocketException exception.

Note

При получении исключения SocketException используйте свойство SocketException.ErrorCode для получения конкретного кода ошибки.If you receive a SocketException exception, use the SocketException.ErrorCode property to obtain the specific error code. После получения этого кода обратитесь к документации по коду ошибки API Windows Sockets версии 2 для получения подробного описания ошибки.After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Note

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети.This member outputs trace information when you enable network tracing in your application. Дополнительные сведения см. в разделе Сетевая трассировка в .NET Framework.For more information, see Network Tracing in the .NET Framework.

Note

Контекст выполнения (контекст безопасности, олицетворенный пользователь и вызывающий контекст) кэшируется для асинхронных Socket методов.The execution context (the security context, the impersonated user, and the calling context) is cached for the asynchronous Socket methods. После первого использования определенного контекста (определенного асинхронного метода Socket, определенного экземпляра Socket и конкретного обратного вызова), последующие применения этого контекста приводят к повышению производительности.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.

Applies to