/// <summary> /// send upd data to server /// </summary> /// <param name="bytes"></param> public void SendUdpData(byte[] bytes) { if (!BytesToSend.TryAdd(bytes)) { AutoLogger.LogText("cannot add udp block"); } }
/// <summary> /// Called to send a specific length of bytes to a server identified by serverKey. The transfer /// is a blocking call and returns on success or raises an exception. If Abort() is called durring /// the transfer, or if a ProgressChanged event handler raises the OperationCanceledException, the /// transfer is silently terminated and the method will return false. /// </summary> /// <param name="location">A string of up to 1024 bytes in length</param> /// <param name="length">The length in bytes to send from the stream</param> /// <param name="rawInput">The stream to read the data from</param> /// <returns>True if the file was successfully received by the server</returns> public bool Upload(string location, long length, Stream rawInput) { Guid transferId = Guid.NewGuid(); int maxMessageLength; // STEP 1: Send a NonceRequest, Create Salt sessionKey = BeginUpload(transferId, location, length, out maxMessageLength); // STEP 2: Send the data Hash fullHash; bool[] failed = new bool[1]; using (HashStream input = new HashStream(new SHA256Managed(), rawInput)) using (WorkQueue queue = new WorkQueue(LimitThreads)) { queue.OnError += (o, e) => { failed[0] = true; }; long pos = 0; while (pos < length && !failed[0] && !_abort.WaitOne(0, false)) { int len = (int)Math.Min(length - pos, maxMessageLength); byte[] buffer = new byte[len]; IOStream.Read(input, buffer, len); BytesToSend task = new BytesToSend(this, LimitThreads, transferId, sessionKey, location, pos, buffer); queue.Enqueue(task.Send); OnProgressChanged(location, pos, length); pos += len; } queue.Complete(true, failed[0] ? 5000 : 300000); fullHash = input.FinalizeHash();//hash of all data transferred } if (_abort.WaitOne(0, false)) { return(false); } Check.Assert <InvalidDataException>(failed[0] == false); // STEP 4: Complete the transfer CompleteUpload(transferId, sessionKey, location, fullHash); OnProgressChanged(location, length, length); return(true); }
/// <summary> /// Called to send a specific length of bytes to a server identified by serverKey. The transfer /// is a blocking call and returns on success or raises an exception. If Abort() is called durring /// the transfer, or if a ProgressChanged event handler raises the OperationCanceledException, the /// transfer is silently terminated and the method will return false. /// </summary> /// <param name="location">A string of up to 1024 bytes in length</param> /// <param name="length">The length in bytes to send from the stream</param> /// <param name="rawInput">The stream to read the data from</param> /// <returns>True if the file was successfully received by the server</returns> public bool Upload(string location, long length, Stream rawInput) { Guid transferId = Guid.NewGuid(); int maxMessageLength; // STEP 1: Send a NonceRequest, Create Salt sessionKey = BeginUpload(transferId, location, length, out maxMessageLength); // STEP 2: Send the data Hash fullHash; bool[] failed = new bool[1]; using (HashStream input = new HashStream(new SHA256Managed(), rawInput)) using (WorkQueue queue = new WorkQueue(LimitThreads)) { queue.OnError += (o, e) => { failed[0] = true; }; long pos = 0; while (pos < length && !failed[0] && !_abort.WaitOne(0, false)) { int len = (int)Math.Min(length - pos, maxMessageLength); byte[] buffer = new byte[len]; IOStream.Read(input, buffer, len); BytesToSend task = new BytesToSend(this, LimitThreads, transferId, sessionKey, location, pos, buffer); queue.Enqueue(task.Send); OnProgressChanged(location, pos, length); pos += len; } queue.Complete(true, failed[0] ? 5000 : 300000); fullHash = input.FinalizeHash();//hash of all data transferred } if (_abort.WaitOne(0, false)) return false; Check.Assert<InvalidDataException>(failed[0] == false); // STEP 4: Complete the transfer CompleteUpload(transferId, sessionKey, location, fullHash); OnProgressChanged(location, length, length); return true; }