Socket.BeginSendFile Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Wysyła plik asynchronicznie do połączonego Socket obiektu.
Przeciążenia
| BeginSendFile(String, AsyncCallback, Object) |
Wysyła plik |
| 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 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 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.