/// <summary> /// 非同期受信コールバック /// </summary> /// <param name="ar"></param> private void ReciveAsyncCallback(IAsyncResult ar) { // オブジェクト変換 SshClientReciveStream stream = (SshClientReciveStream)ar.AsyncState; // 非同期読込が終了 int bytesRead = stream.ShellStream.EndRead(ar); System.Console.WriteLine("受信(非同期)データサイズ:{0}", bytesRead); // ロギング this.Logger.InfoFormat("受信(非同期)データ - {0:#,0} byte:\n{1}", bytesRead, Common.Diagnostics.Debug.Dump(1, stream.Buffer, bytesRead)); // 受信通知 this.OnReciveNotify.Set(); // イベント呼出 if (this.OnRecive != null) { // イベントパラメータ生成 SshClientReciveEventArgs eventArgs = new SshClientReciveEventArgs() { ConnectionInfo = stream.ConnectionInfo, Size = bytesRead, Stream = stream.Stream, }; // イベント呼出し this.OnRecive(this, eventArgs); } // ShellStreamフラッシュ stream.ShellStream.Flush(); // 受信通知リセット this.OnReciveNotify.Reset(); }
/// <summary> /// 受信 /// </summary> /// <param name="size"></param> /// <returns></returns> public MemoryStream Recive(int size) { // 返却用オブジェクト生成 MemoryStream memoryStream = new MemoryStream(); // Taskオブジェクト生成 using (CancellationTokenSource source = new CancellationTokenSource()) { // タイムアウト設定 source.CancelAfter(this.m_Timeout.Recv); // Task開始 Task task = Task.Factory.StartNew(() => { // ShellStreamにバッファ長が0以上になるまで待合せ while (this.m_ShellStream.Length == 0) { Thread.Sleep(100); } // 読込 byte[] _readbuffer = new byte[this.m_ShellStream.Length]; if (this.m_ShellStream.Read(_readbuffer, 0, _readbuffer.Length) != 0) { // 文字コード変換 System.Text.Encoding src = Common.Text.Encoding.GetCode(_readbuffer); System.Text.Encoding dest = System.Text.Encoding.GetEncoding("Shift_JIS"); byte[] temp = System.Text.Encoding.Convert(src, dest, _readbuffer); memoryStream.Write(temp, 0, temp.Length); } }, source.Token); try { // タスク待ち task.Wait(source.Token); // 通知リセット this.OnReciveNotify.Reset(); // イベント呼出判定 if (this.OnRecive != null) { // イベントパラメータ設定 SshClientReciveEventArgs _SshClientReciveEventArgs = new SshClientReciveEventArgs() { ConnectionInfo = this.m_ConnectionInfo, Size = (int)memoryStream.Length, Stream = memoryStream, }; // イベント呼出し this.OnRecive(this, _SshClientReciveEventArgs); } // 結果返却 return(memoryStream); } catch (OperationCanceledException ex) { // 通知リセット this.OnReciveNotify.Reset(); // 例外 throw new SshClientExceptions("受信(SSH)に失敗しました:[" + this.m_IpAddress + ":" + this.m_Port.ToString() + "]", ex); } catch (AggregateException ex) { // 通知リセット this.OnReciveNotify.Reset(); // 例外 throw new SshClientExceptions("受信(SSH)に失敗しました:[" + this.m_IpAddress + ":" + this.m_Port.ToString() + "]", ex); } } }