PipeStream.Read Method
Definition
Important
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Overloads
Read(Span<Byte>) |
Reads a sequence of bytes from the current stream, writes them to a byte array, and advances the position within the stream by the number of bytes read. |
Read(Byte[], Int32, Int32) |
Reads a block of bytes from a stream and writes the data to a specified buffer starting at a specified position for a specified length. |
Read(Span<Byte>)
- Source:
- PipeStream.Unix.cs
- Source:
- PipeStream.Unix.cs
- Source:
- PipeStream.Unix.cs
Reads a sequence of bytes from the current stream, writes them to a byte array, and advances the position within the stream by the number of bytes read.
public:
override int Read(Span<System::Byte> buffer);
public override int Read (Span<byte> buffer);
override this.Read : Span<byte> -> int
Public Overrides Function Read (buffer As Span(Of Byte)) As Integer
Parameters
A region of memory. When this method returns, the contents of this region are replaced by the bytes read from the current source.
Returns
The total number of bytes read into the buffer
. This can be less than the number of bytes allocated in buffer
if that many bytes are not currently available, or zero (0) if the end of the stream has been reached.
Exceptions
The number of bytes read was longer than the buffer length.
The stream does not support reading.
Cannot access a closed pipe.
The pipe hasn't been connected yet.
-or-
The pipe is in a disconnected state.
-or-
The pipe handle has not been set. (Did your PipeStream implementation call InitializeHandle(SafePipeHandle, Boolean, Boolean)?
Remarks
Use the CanRead property to determine whether the current PipeStream object supports read operations.
Use the ReadAsync method to read asynchronously from the current stream.
This method reads a maximum of buffer.Length
bytes from the current stream and stores them in buffer
. The current position within the stream is advanced by the number of bytes read; however, if an exception occurs, the current position within the stream remains unchanged.
This method will block until at least one byte of data can be read, in the event that no data is available.
This method returns 0 only when there is no more data in the stream and no more is expected (such as a closed socket or end of file).
This method is free to return fewer bytes than requested even if the end of the stream has not been reached.
Use BinaryReader
for reading primitive data types.
Applies to
Read(Byte[], Int32, Int32)
- Source:
- PipeStream.Unix.cs
- Source:
- PipeStream.Unix.cs
- Source:
- PipeStream.Unix.cs
Reads a block of bytes from a stream and writes the data to a specified buffer starting at a specified position for a specified length.
public:
override int Read(cli::array <System::Byte> ^ buffer, int offset, int count);
public override int Read (byte[] buffer, int offset, int count);
[System.Security.SecurityCritical]
public override int Read (byte[] buffer, int offset, int count);
override this.Read : byte[] * int * int -> int
[<System.Security.SecurityCritical>]
override this.Read : byte[] * int * int -> int
Public Overrides Function Read (buffer As Byte(), offset As Integer, count As Integer) As Integer
Parameters
- buffer
- Byte[]
When this method returns, contains the specified byte array with the values between offset
and (offset
+ count
- 1) replaced by the bytes read from the current source.
- offset
- Int32
The byte offset in the buffer
array at which the bytes that are read will be placed.
- count
- Int32
The maximum number of bytes to read.
Returns
The total number of bytes that are read into buffer
. This might be less than the number of bytes requested if that number of bytes is not currently available, or 0 if the end of the stream is reached.
- Attributes
Exceptions
buffer
is null
.
count
is greater than the number of bytes available in buffer
.
The pipe is closed.
The pipe does not support read operations.
The pipe is disconnected, waiting to connect, or the handle has not been set.
Any I/O error occurred.
Examples
The following example creates an anonymous pipe client and pipe server. The pipe server uses the Read method to read a series of bytes from the pipe client as a validation code. Both the pipe client and the pipe server are part of the same example. The server portion of the example creates a client process and passes it an anonymous pipe handle as an argument.
#using <System.dll>
#using <System.Core.dll>
using namespace System;
using namespace System::IO;
using namespace System::IO::Pipes;
using namespace System::Diagnostics;
ref class PipeStreamExample
{
private:
static array<Byte>^ matchSign = {9, 0, 9, 0};
public:
static void Main()
{
array<String^>^ args = Environment::GetCommandLineArgs();
if (args->Length < 2)
{
Process^ clientProcess = gcnew Process();
clientProcess->StartInfo->FileName = Environment::CommandLine;
AnonymousPipeServerStream^ pipeServer =
gcnew AnonymousPipeServerStream(PipeDirection::In,
HandleInheritability::Inheritable);
// Pass the client process a handle to the server.
clientProcess->StartInfo->Arguments = pipeServer->GetClientHandleAsString();
clientProcess->StartInfo->UseShellExecute = false;
Console::WriteLine("[SERVER] Starting client process...");
clientProcess->Start();
pipeServer->DisposeLocalCopyOfClientHandle();
try
{
if (WaitForClientSign(pipeServer))
{
Console::WriteLine("[SERVER] Valid sign code received!");
}
else
{
Console::WriteLine("[SERVER] Invalid sign code received!");
}
}
catch (IOException^ e)
{
Console::WriteLine("[SERVER] Error: {0}", e->Message);
}
clientProcess->WaitForExit();
clientProcess->Close();
Console::WriteLine("[SERVER] Client quit. Server terminating.");
}
else
{
PipeStream^ pipeClient =
gcnew AnonymousPipeClientStream(PipeDirection::Out, args[1]);
try
{
Console::WriteLine("[CLIENT] Sending sign code...");
SendClientSign(pipeClient);
}
catch (IOException^ e)
{
Console::WriteLine("[CLIENT] Error: {0}", e->Message);
}
Console::WriteLine("[CLIENT] Terminating.");
}
}
private:
static bool WaitForClientSign(PipeStream^ inStream)
{
array<Byte>^ inSign = gcnew array<Byte>(matchSign->Length);
int len = inStream->Read(inSign, 0, matchSign->Length);
bool valid = len == matchSign->Length;
while (valid && len-- > 0)
{
valid = valid && (matchSign[len] == inSign[len]);
}
return valid;
}
static void SendClientSign(PipeStream^ outStream)
{
outStream->Write(matchSign, 0, matchSign->Length);
}
};
int main()
{
PipeStreamExample::Main();
}
using System;
using System.IO;
using System.IO.Pipes;
using System.Diagnostics;
class PipeStreamExample
{
private static byte[] matchSign = {9, 0, 9, 0};
public static void Main()
{
string[] args = Environment.GetCommandLineArgs();
if (args.Length < 2)
{
Process clientProcess = new Process();
clientProcess.StartInfo.FileName = Environment.CommandLine;
using (AnonymousPipeServerStream pipeServer =
new AnonymousPipeServerStream(PipeDirection.In,
HandleInheritability.Inheritable))
{
// Pass the client process a handle to the server.
clientProcess.StartInfo.Arguments = pipeServer.GetClientHandleAsString();
clientProcess.StartInfo.UseShellExecute = false;
Console.WriteLine("[SERVER] Starting client process...");
clientProcess.Start();
pipeServer.DisposeLocalCopyOfClientHandle();
try
{
if (WaitForClientSign(pipeServer))
{
Console.WriteLine("[SERVER] Valid sign code received!");
}
else
{
Console.WriteLine("[SERVER] Invalid sign code received!");
}
}
catch (IOException e)
{
Console.WriteLine("[SERVER] Error: {0}", e.Message);
}
}
clientProcess.WaitForExit();
clientProcess.Close();
Console.WriteLine("[SERVER] Client quit. Server terminating.");
}
else
{
using (PipeStream pipeClient = new AnonymousPipeClientStream(PipeDirection.Out, args[1]))
{
try
{
Console.WriteLine("[CLIENT] Sending sign code...");
SendClientSign(pipeClient);
}
catch (IOException e)
{
Console.WriteLine("[CLIENT] Error: {0}", e.Message);
}
}
Console.WriteLine("[CLIENT] Terminating.");
}
}
private static bool WaitForClientSign(PipeStream inStream)
{
byte[] inSign = new byte[matchSign.Length];
int len = inStream.Read(inSign, 0, matchSign.Length);
bool valid = len == matchSign.Length;
while (valid && len-- > 0)
{
valid = valid && (matchSign[len] == inSign[len]);
}
return valid;
}
private static void SendClientSign(PipeStream outStream)
{
outStream.Write(matchSign, 0, matchSign.Length);
}
}
Imports System.IO
Imports System.IO.Pipes
Imports System.Diagnostics
Class PipeStreamExample
Private Shared matchSign() As Byte = {9, 0, 9, 0}
Public Shared Sub Main()
Dim args() As String = Environment.GetCommandLineArgs()
If args.Length < 2 Then
Dim clientProcess As New Process()
clientProcess.StartInfo.FileName = Environment.CommandLine
Using pipeServer As New AnonymousPipeServerStream( _
PipeDirection.In, HandleInheritability.Inheritable)
' Pass the client process a handle to the server.
clientProcess.StartInfo.Arguments = pipeServer.GetClientHandleAsString()
clientProcess.StartInfo.UseShellExecute = false
Console.WriteLine("[SERVER] Starting client process...")
clientProcess.Start()
pipeServer.DisposeLocalCopyOfClientHandle()
Try
If WaitForClientSign(pipeServer) Then
Console.WriteLine("[SERVER] Valid sign code received!")
Else
Console.WriteLine("[SERVER] Invalid sign code received!")
End If
Catch e As IOException
Console.WriteLine("[SERVER] Error: {0}", e.Message)
End Try
End Using
clientProcess.WaitForExit()
clientProcess.Close()
Console.WriteLine("[SERVER] Client quit. Server terminating.")
Else
Using pipeClient As PipeStream = New AnonymousPipeClientStream(PipeDirection.Out, args(1))
Try
Console.WriteLine("[CLIENT] Sending sign code...")
SendClientSign(pipeClient)
Catch e As IOException
Console.WriteLine("[CLIENT] Error: {0}", e.Message)
End Try
End Using
Console.WriteLine("[CLIENT] Terminating.")
End If
End Sub
Private Shared Function WaitForClientSign(inStream As PipeStream) As Boolean
Dim inSign() As Byte = Array.CreateInstance(GetType(Byte), matchSign.Length)
Dim len As Integer = inStream.Read(inSign, 0, matchSign.Length)
Dim valid = len.Equals(matchSign.Length)
While len > 0
len -= 1
valid = valid And (matchSign(len).Equals(inSign(len)))
End While
Return valid
End Function
Private Shared Sub SendClientSign(outStream As PipeStream)
outStream.Write(matchSign, 0, matchSign.Length)
End Sub
End Class
Remarks
Use the CanRead property to determine whether the current PipeStream object supports read operations.
Calling the Read method blocks until count
bytes are read or the end of the stream is reached. For asynchronous read operations, see BeginRead and EndRead.