Поделиться через


Socket.SendFile Метод

Определение

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

Перегрузки

SendFile(String)

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

SendFile(String, Byte[], Byte[], TransmitFileOptions)

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

SendFile(String, ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, TransmitFileOptions)

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

SendFile(String)

Исходный код:
Socket.cs
Исходный код:
Socket.cs
Исходный код:
Socket.cs

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

public:
 void SendFile(System::String ^ fileName);
public void SendFile (string fileName);
public void SendFile (string? fileName);
member this.SendFile : string -> unit
Public Sub SendFile (fileName As String)

Параметры

fileName
String

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

Исключения

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

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

Объект Socket не находится в режиме блокировки и не может принять этот синхронный вызов.

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

Произошла ошибка при попытке доступа к сокету.

Примеры

В следующем примере кода создается и подключается сокет, а затем отправляется файл удаленному узлу. Файл "test.txt" находится в корневом каталоге локального компьютера.

// Establish the local endpoint for the socket.
IPHostEntry^ ipHost = Dns::GetHostEntry( Dns::GetHostName() );
IPAddress^ ipAddr = ipHost->AddressList[ 0 ];
IPEndPoint^ ipEndPoint = gcnew IPEndPoint( ipAddr,11000 );

// Create a TCP socket.
Socket^ client = gcnew Socket( AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp );

// Connect the socket to the remote endpoint.
client->Connect( ipEndPoint );

// There is a text file test.txt located in the root directory.
String^ fileName = "C:\\test.txt";

// Send file fileName to remote device
Console::WriteLine( "Sending {0} to the host.", fileName );
client->SendFile( fileName );

// Release the socket.
client->Shutdown( SocketShutdown::Both );
client->Close();
// Establish the local endpoint for the socket.
IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress  ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);

// Create a TCP socket.
Socket client = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp);

// Connect the socket to the remote endpoint.
client.Connect(ipEndPoint);

// There is a text file test.txt located in the root directory.
string fileName = "C:\\test.txt";

// Send file fileName to remote device
Console.WriteLine("Sending {0} to the host.", fileName);
client.SendFile(fileName);

// Release the socket.
client.Shutdown(SocketShutdown.Both);
client.Close();

Комментарии

Эта перегрузка отправляет файл fileName в подключенный сокет. Параметр flags по умолчанию — UseDefaultWorkerThread (0), а preBuffer параметры и postBuffer — значение null. Если fileName находится в локальном каталоге, его можно определить только по имени файла; в противном случае необходимо указать полный путь и имя файла. Подстановочные знаки (". поддерживаются имена общих ресурсов \\myfile.txt") и UNC ("\\shared directory\\myfile.txt"). Если файл не найден, возникает исключение FileNotFoundException .

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

SendFile синхронно отправляет файл на удаленный узел, указанный в методе Connect или Accept . SendFile может использоваться как для протоколов, ориентированных на подключение, так и для протоколов без подключения.

Если вы используете протокол без подключения, необходимо вызвать Connect перед вызовом этого метода, в противном случае SendFile вызывается SocketException исключение. Если вы используете протокол, ориентированный на подключение, необходимо использовать Connect для установки подключения к удаленному узлу или использовать для Accept принятия входящего подключения.

Если вы используете протокол, ориентированный на подключение, блокируется до SendFile отправки файла. В неблокировке SendFile может завершиться до отправки всего файла. Нет никакой гарантии, что отправляемые данные будут отображаться в сети немедленно. Чтобы повысить эффективность сети, базовая система может отложить передачу, пока не будет собран значительный объем исходящих данных. Успешное завершение SendFile метода означает, что в базовой системе есть место для буферизации данных для отправки по сети.

Примечание

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

Примечание

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

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

SendFile(String, Byte[], Byte[], TransmitFileOptions)

Исходный код:
Socket.cs
Исходный код:
Socket.cs
Исходный код:
Socket.cs

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

public:
 void SendFile(System::String ^ fileName, cli::array <System::Byte> ^ preBuffer, cli::array <System::Byte> ^ postBuffer, System::Net::Sockets::TransmitFileOptions flags);
public void SendFile (string? fileName, byte[]? preBuffer, byte[]? postBuffer, System.Net.Sockets.TransmitFileOptions flags);
public void SendFile (string fileName, byte[] preBuffer, byte[] postBuffer, System.Net.Sockets.TransmitFileOptions flags);
member this.SendFile : string * byte[] * byte[] * System.Net.Sockets.TransmitFileOptions -> unit
Public Sub SendFile (fileName As String, preBuffer As Byte(), postBuffer As Byte(), flags As TransmitFileOptions)

Параметры

fileName
String

Путь и имя отправляемого файла. Этот параметр может иметь значение null.

preBuffer
Byte[]

Данные, отправляемые перед отправкой файла. Этот параметр может иметь значение null.

postBuffer
Byte[]

Данные, отправляемые после отправки файла. Этот параметр может иметь значение null.

flags
TransmitFileOptions

Побитовая комбинация значений перечисления, указывающая способ передачи файла.

Исключения

Операционной системой не является Windows NT или более поздняя версия.

-или-

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

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

Объект Socket не находится в режиме блокировки и не может принять этот синхронный вызов.

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

Произошла ошибка при попытке доступа к сокету.

Примеры

В следующем примере кода создается и подключается сокет. Файл "test.txt" находится в корневом каталоге локального компьютера. В этом примере мы создадим пребуфер и постбуфер данных и отправим их на удаленный узел с файлом . Используются значения по умолчанию TransmitFileOptions .

// Establish the local endpoint for the socket.
IPHostEntry^ ipHost = Dns::GetHostEntry( Dns::GetHostName() );
IPAddress^ ipAddr = ipHost->AddressList[ 0 ];
IPEndPoint^ ipEndPoint = gcnew IPEndPoint( ipAddr,11000 );

// Create a TCP socket.
Socket^ client = gcnew Socket( AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp );

// Connect the socket to the remote endpoint.
client->Connect( ipEndPoint );

// Send file fileName to the remote host with preBuffer and postBuffer data.
// There is a text file test.txt located in the root directory.
String^ fileName = "C:\\test.txt";

// 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 );

//Send file fileName with buffers and default flags to the remote device.
Console::WriteLine( "Sending {0} with buffers to the host.{1}", fileName, Environment::NewLine );
client->SendFile( fileName, preBuf, postBuf, TransmitFileOptions::UseDefaultWorkerThread );

// Release the socket.
client->Shutdown( SocketShutdown::Both );
client->Close();
// Establish the local endpoint for the socket.
IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress  ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);

// Create a TCP socket.
Socket client = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp);

// Connect the socket to the remote endpoint.
client.Connect(ipEndPoint);

// Send file fileName to the remote host with preBuffer and postBuffer data.
// There is a text file test.txt located in the root directory.
string fileName = "C:\\test.txt";

// 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);

//Send file fileName with buffers and default flags to the remote device.
Console.WriteLine("Sending {0} with buffers to the host.{1}", fileName, Environment.NewLine);
client.SendFile(fileName, preBuf, postBuf, TransmitFileOptions.UseDefaultWorkerThread);

// Release the socket.
client.Shutdown(SocketShutdown.Both);
client.Close();

Комментарии

Для этой перегрузки требуется имя файла, который требуется отправить, и побитовое сочетание значений TransmitFileOptions . Параметр preBuffer содержит все данные, которые должны предшествовать файлу. postBuffer содержит данные, которые вы хотите подписать на файл. Если fileName находится в текущем рабочем каталоге, его можно идентифицировать только по имени файла; в противном случае необходимо указать полный путь и имя файла. Подстановочные знаки (". поддерживаются имена общих ресурсов \\myfile.txt") и UNC ("\\shared directory\\myfile.txt").

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

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

SendFile синхронно отправляет файл на удаленный узел, указанный в методе Connect или Accept . SendFile может использоваться как для протоколов, ориентированных на подключение, так и для протоколов без подключения.

Если вы используете протокол без подключения, необходимо вызвать Connect перед вызовом SocketExceptionэтого метода; в противном случае SendFile вызывает исключение . Если вы используете протокол, ориентированный на подключение, необходимо либо использовать для Connect установки подключения к удаленному узлу, либо использовать для Accept принятия входящего подключения.

Если вы используете протокол, ориентированный на подключение, блокируется, SendFile пока не будет отправлен весь файл. В неблокировке SendFile может завершиться до отправки всего файла. Нет никакой гарантии, что отправляемые данные будут отображаться в сети немедленно. Чтобы повысить эффективность сети, базовая система может отложить передачу, пока не будет собран значительный объем исходящих данных. Успешное завершение SendFile метода означает, что в базовой системе есть место для буферизации данных для отправки по сети.

Примечание

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

Примечание

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

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

SendFile(String, ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, TransmitFileOptions)

Исходный код:
Socket.cs
Исходный код:
Socket.cs
Исходный код:
Socket.cs

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

public:
 void SendFile(System::String ^ fileName, ReadOnlySpan<System::Byte> preBuffer, ReadOnlySpan<System::Byte> postBuffer, System::Net::Sockets::TransmitFileOptions flags);
public void SendFile (string? fileName, ReadOnlySpan<byte> preBuffer, ReadOnlySpan<byte> postBuffer, System.Net.Sockets.TransmitFileOptions flags);
member this.SendFile : string * ReadOnlySpan<byte> * ReadOnlySpan<byte> * System.Net.Sockets.TransmitFileOptions -> unit
Public Sub SendFile (fileName As String, preBuffer As ReadOnlySpan(Of Byte), postBuffer As ReadOnlySpan(Of Byte), flags As TransmitFileOptions)

Параметры

fileName
String

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

preBuffer
ReadOnlySpan<Byte>

Объект ReadOnlySpan<T> , содержащий данные, отправляемые перед отправкой файла. Этот буфер может быть пустым.

postBuffer
ReadOnlySpan<Byte>

Объект ReadOnlySpan<T> , содержащий данные, отправляемые после отправки файла. Этот буфер может быть пустым.

flags
TransmitFileOptions

Одно или несколько значений TransmitFileOptions.

Исключения

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

Объект Socket не подключен к удаленному узлу.

Объект Socket не находится в режиме блокировки и не может принять этот синхронный вызов.

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

Произошла ошибка при попытке доступа к сокету.

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