Example #1
0
        /// <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();
        }
Example #2
0
        /// <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);
                }
            }
        }