TcpClient client = new(SERVER_IP, PORT_NO);
NetworkStream stream = client.GetStream();
stream.Write(WriteArry, 0, WriteArry.Length);
byte[] data = new byte[10];
int recivedbyte = stream.Read(data, 0, 10);
how can i check if Length of received data less than 10 wait more for Remaining data?
or Data to received more than once?
Thanks
byte[] data = new byte[10];
int read, remaining = data.Length;
while (remaining > 0 && (read =
stream.Read(data, data.Length - remaining, remaining)) > 0)
{
remaining -= read;
}
if (remaining != 0) throw new EndOfStreamException(); // EOF
Related
I am trying to upload large files to 3rd part service by chunks. But I have problem with last chunk. Last chunk would be always smaller then 5mb, but all chunks incl. the last have all the same size - 5mb
My code:
int chunkSize = 1024 * 1024 * 5;
using (Stream streamx = new FileStream(file.Path, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[chunkSize];
int bytesRead = 0;
long bytesToRead = streamx.Length;
while (bytesToRead > 0)
{
int n = streamx.Read(buffer, 0, chunkSize);
if (n == 0) break;
// do work on buffer...
// uploading chunk ....
var partRequest = HttpHelpers.InvokeHttpRequestStream
(
new Uri(endpointUri + "?partNumber=" + i + "&uploadId=" + UploadId),
"PUT",
partHeaders,
buffer
); // upload buffer
bytesRead += n;
bytesToRead -= n;
}
streamx.Dispose();
}
buffer is uploaded on 3rd party service.
Solved, someone posted updated code in comment, but after some seconds deleted this comment. But there was solution. I added this part after
if (n == 0)
this code, which resizes last chunk on the right size
// Let's resize the last incomplete buffer
if (n != buffer.Length)
Array.Resize(ref buffer, n);
Thank you all.
I post full working code:
int chunkSize = 1024 * 1024 * 5;
using (Stream streamx = new FileStream(file.Path, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[chunkSize];
int bytesRead = 0;
long bytesToRead = streamx.Length;
while (bytesToRead > 0)
{
int n = streamx.Read(buffer, 0, chunkSize);
if (n == 0) break;
// Let's resize the last incomplete buffer
if (n != buffer.Length)
Array.Resize(ref buffer, n);
// do work on buffer...
// uploading chunk ....
var partRequest = HttpHelpers.InvokeHttpRequestStream
(
new Uri(endpointUri + "?partNumber=" + i + "&uploadId=" + UploadId),
"PUT",
partHeaders,
buffer
); // upload buffer
bytesRead += n;
bytesToRead -= n;
}
}
Send an array of bytes
public static void SendFile(string path)
{
byte[] data = File.ReadAllBytes(path);
stream.Write(data, 0, data.Length);
}
Getting the byte array
List<byte> list = new List<byte>();
byte[] data = new byte[64];
int bytes = 0;
do
{
bytes = stream.Read(data, 0, data.Length);
for (int i = 0; i < data.Length; i++)
{
list.Add(data[i]);
}
} while (stream.DataAvailable);
return list.ToArray();
Creating a file
byte[] file = ReciveFile().ToArray();
File.WriteAllBytes(message, file);
Appear extra characters like these
before
after
How to fix? Thanks
You need to check how many bytes were read. Otherwise the end of your buffer may contain garbage if the file's length isn't an exact multiple of 64.
do
{
bytes = stream.Read(data, 0, data.Length);
for (int i = 0; i < bytes; i++) //use bytes, not data.Length
{
list.Add(data[i]);
}
} while (bytes > 0);
Hi i currently use the following code to split a file into muliple 2mb smaller parts.
const int BUFFER_SIZE = 20 * 1024;
byte[] buffer = new byte[BUFFER_SIZE];
using (Stream input = File.OpenRead(inputFile)) {
int index = 0;
while (input.Position < input.Length) {
using (Stream output = File.Create(path)) {
int remaining = chunkSize, bytesRead;
while (remaining > 0 && (bytesRead = input.Read(buffer, 0,
Math.Min(remaining, BUFFER_SIZE))) > 0) {
output.Write(buffer, 0, bytesRead);
remaining -= bytesRead;
}
}
}
index++;
}
This works perfectly, and will split a 10mb file into 5 x 2mb files 0.part,2.part ect...
I would like to know how I would generate just part 3 again knowing the chunkSize always stays at 2mb. I can achieve this by wrapping in an if,else and evaluating index, but with a 1GB file this process can take a while to loop through. I'd like to understand this function more and how I can just get the part of the file I require?
input.Position property is settable. If you know that you need part 3, set Position to 2*chunkSize to skip the first two chunks, and do the innermost while loop once to copy from that position to the output:
int desiredChunkNumber = 3;
using (Stream input = File.OpenRead(inputFile)) {
input.Position = (desiredChunkNumber - 1) * chunkSize;
using (Stream output = File.Create(path)) {
int remaining = chunkSize, bytesRead;
while (remaining > 0 && (bytesRead = input.Read(buffer, 0,
Math.Min(remaining, BUFFER_SIZE))) > 0) {
output.Write(buffer, 0, bytesRead);
remaining -= bytesRead;
}
}
}
I'm trying to recieve a tcp packet in C# but I don't know when can I stop reading from the stream.
Here's what I've tried:
for(int i = 0; i < stm.Length; i += chunkSize)
{
bb = new byte[chunkSize];
k = stm.Read(bb, 0, bb.Length);
ns.Write(bb, 0, k);
}
But it threw me an error about that the stream is not seekable.
So I've tried this:
int k = chunkSize;
while (k == chunkSize)
{
bb = new byte[chunkSize];
k = stm.Read(bb, 0, bb.Length);
ns.Write(bb, 0, k);
}
Is there anything to do?
Thanks :)
Here we go:
int read;
while((read = stm.Read(bb, 0, bb.Length)) > 0) {
// process "read"-many bytes from bb
ns.Write(bb, 0, read);
}
"read" will be non-positive at the end of the stream, and only at the end of the stream.
Or more simply (in 4.0):
stm.CopyTo(ns);
a binary reader is what you would require since it knows exactly how many bytes to read!
It prefixes the length of the bytes and so it knows how much to read!
Good Day,
I am writing an application where I'm downloading a file that is over 30MB. I am keeping track of how many bytes that have been currently been downloaded.
My question is:
I want to determine when I go past 1M, 2M, 3M and so forth.
My logic is:
int totalFileSave = 0;
...
...
int bytesRead = responseStream.Read(buffer, 0, 4096);
totalFileSave += bytesRead;
while (bytesRead > 0) {
// How do I test when I hit 1M, 2M, 3M and so forth...
bytesRead = responseStream.Read(buffer, 0, 4096);
totalFileSave += bytesRead;
}
private const int MEGABYTE = 1024 * 1024;
if ((bytesRead % MEGABYTE) == 0)
{
// Do something...
}
How about something like this:
private const int megaByte = 1024 * 1024;
private int current = 0;
while (bytesRead > 0)
{
bytesRead = responseStream.Read(buffer, 0, 4096);
totalFileSave += bytesRead;
int total = bytesRead / megaByte;
if (total > current)
{
current = total;
// you went up 1 M and are now at or greater than 'current'M
}
}