예제 #1
0
        //CR NUL -> CR •ÏŠ·‚¨‚æ‚Ñ IAC‚©‚ç‚Í‚¶‚Ü‚éƒV[ƒPƒ“ƒX‚̏ˆ—
        private void ProcessBuffer(ByteDataFragment data)
        {
            int limit  = data.Offset + data.Length;
            int offset = data.Offset;

            byte[] buf = data.Buffer;
            //Debug.WriteLine(String.Format("Telnet len={0}, proc={1}", data.Length, _negotiator.InProcessing));

            while (offset < limit)
            {
                while (offset < limit && _negotiator.InProcessing)
                {
                    if (_negotiator.Process(buf[offset++]) == TelnetNegotiator.ProcessResult.REAL_0xFF)
                    {
                        _callback.OnReception(_localdata.Set(buf, offset - 1, 1));
                    }
                }

                int delim = offset;
                while (delim < limit)
                {
                    byte b = buf[delim];
                    if (b == 0xFF)
                    {
                        _negotiator.StartNegotiate();
                        break;
                    }
                    if (b == 0 && delim - 1 >= 0 && buf[delim - 1] == 0x0D)
                    {
                        break;                                                              //CR NULƒTƒ|[ƒg
                    }
                    delim++;
                }

                if (delim > offset)
                {
                    _callback.OnReception(_localdata.Set(buf, offset, delim - offset));                            //delim‚ÌŽè‘O‚܂ŏˆ—
                }
                offset = delim + 1;
            }
        }
예제 #2
0
 public void RepeatAsyncRead(IByteAsyncInputStream cb)
 {
     _callback = cb;
     //ƒoƒbƒtƒ@‚ɉ½‚ª‚µ‚©—­‚Ü‚Á‚Ä‚¢‚éê‡F
     //NOTE ‚±‚ê‚́AIPoderosaSocket#StartAsyncRead‚ðŒÄ‚ÔƒV[ƒPƒ“ƒX‚ð‚È‚­‚µAÚ‘±‚ðŠJŽn‚·‚éuŠÔ(IProtocolService‚̃ƒ\ƒbƒhŒn)‚©‚ç
     //ƒf[ƒ^–{‘Ì‚ðŽóM‚·‚éŒû‚ð’ñ‹Ÿ‚³‚¹‚é‚悤‚É‚·‚ê‚Ώœ‹Ž‚Å‚«‚éB‚µ‚©‚µƒvƒƒOƒ‰ƒ}‚Ì‘¤‚Æ‚µ‚ẮAÚ‘±¬Œ÷‚ðŠm”F‚µ‚Ä‚©‚çƒf[ƒ^ŽóMŒû‚ð—pˆÓ‚µ‚½‚¢‚̂ŁA
     //iPoderosa‚Å‚¢‚¦‚΁AƒƒOƒCƒ“ƒ{ƒ^ƒ“‚ÌOK‚ð‰Ÿ‚·Žž“_‚ÅAbstractTerminal‚܂ŏ€”õ‚¹‚˂΂Ȃç‚È‚¢‚Æ‚¢‚¤‚±‚ƁjA‚»‚ê‚æ‚è‚̓f[ƒ^‚ð•Û—¯‚µ‚Ä‚¢‚é‚Ù‚¤‚ª‚¢‚¢‚¾‚낤
     if (_buffer != null)
     {
         lock (this) {
             _buffer.Close();
             byte[] t = _buffer.ToArray();
             _data.Set(t, 0, t.Length);
             if (t.Length > 0)
             {
                 _callback.OnReception(_data);
             }
             _buffer = null;
         }
     }
 }
예제 #3
0
        private void RepeatCallback(IAsyncResult result)
        {
            try {
                int n = _socket.EndReceive(result);
                _dataFragment.Set(_buf, 0, n);
                Debug.Assert(_ownerConnection != null); //‚±‚ê‚ðŒÄ‚яo‚·‚悤‚É‚È‚é‚܂łɂ̓Zƒbƒg‚³‚ê‚Ä‚¢‚邱‚ƁI

                if (n > 0)
                {
                    if (OnReceptionCore(_dataFragment) == GenericResult.Succeeded)
                    {
                        BeginReceive();
                    }
                }
                else if (n < 0)
                {
                    //WindowsME‚É‚¨‚¢‚ẮA‚Æ‚«‚Ç‚«‚±‚±‚Å-1‚ª•Ô‚Á‚Ä‚«‚Ä‚¢‚邱‚Æ‚ª”­Šo‚µ‚½B‰º‚ÌErrorCode 995‚̏ꍇ‚à“¯—l
                    BeginReceive();
                }
                else
                {
                    OnNormalTerminationCore();
                }
            }
            catch (Exception ex) {
                if (!_ownerConnection.IsClosed)
                {
                    RuntimeUtil.SilentReportException(ex);
                    if ((ex is SocketException) && ((SocketException)ex).ErrorCode == 995)
                    {
                        BeginReceive();
                    }
                    else
                    {
                        OnAbnormalTerminationCore(ex.Message);
                    }
                }
            }
        }