Beispiel #1
0
        public void EchoサーバにlineSendで1行送信してlineRecvで1行受信する()
        {
            //setUp
            const string addr = "127.0.0.1";
            const int    port = 9993;

            var sv = new EchoServer(addr, port);

            sv.Start();
            var sut = new SockTcp(new Kernel(), new Ip(addr), port, 100, null);

            sut.LineSend(Encoding.UTF8.GetBytes("本日は晴天なり"));
            Thread.Sleep(10);

            var expected = "本日は晴天なり\r\n";

            //exercise
            var bytes  = sut.LineRecv(1, this);
            var actual = Encoding.UTF8.GetString(bytes);

            //verify
            Assert.That(actual, Is.EqualTo(expected));

            //tearDown
            sut.Close();
            sv.Stop();
        }
Beispiel #2
0
        protected override string ConnectJob(SockTcp client, SockTcp server, List <byte[]> clientBuf)
        {
            //最初のグリーティングメッセージ取得
            var buf = server.LineRecv(Timeout, this);

            if (buf == null)
            {
                return(null);//タイムアウト
            }
            //EHLO送信
            server.LineSend(clientBuf[0]);
            clientBuf.RemoveAt(0);

            //「250 OK」が返るまで読み飛ばす
            while (IsLife())
            {
                buf = server.LineRecv(Timeout, this);
                if (buf == null)
                {
                    return(null);//タイムアウト
                }
                var str = Inet.TrimCrlf(Encoding.ASCII.GetString(buf));
                if (str.ToUpper().IndexOf("250 ") == 0)
                {
                    return(str);
                }
            }
            return(null);
        }
Beispiel #3
0
        //接続単位の処理
        override protected void OnSubThread(SockObj sockObj)
        {
            var     client = (SockTcp)sockObj;
            SockTcp server = null;

            string _targetServer;
            int    _targetPort;
            var    clientBuf = new List <byte[]>();

            _targetServer = (string)Conf.Get("targetServer");
            _targetPort   = (int)Conf.Get("targetPort");
            if (_targetServer == "")
            {
                Logger.Set(LogKind.Error, client, 1, "");
                goto end;
            }
            if (_targetPort == 0)
            {
                Logger.Set(LogKind.Error, client, 2, "");
                goto end;
            }


            //***************************************************************
            //前処理(接続先・ユーザの取得と特別なユーザの置換)
            //***************************************************************
            {
                var keyWord = BeforeJob(client, clientBuf);//接続前の処理
                if (keyWord == null)
                {
                    goto end;
                }


                //特別なユーザにヒットしているかどうかの確認
                OneSpecialUser oneSpecialUser = _specialUser.Search(keyWord);
                if (oneSpecialUser != null) //ヒットした場合
                //置換
                {
                    _targetServer = oneSpecialUser.Server; //サーバ
                    _targetPort   = oneSpecialUser.Port;   //ポート番号

                    for (var i = 0; i < clientBuf.Count; i++)
                    {
                        //string str = Inet.TrimCRLF(Encoding.ASCII.GetString(clientBuf[i]));
                        var str = Encoding.ASCII.GetString(clientBuf[i]);
                        if ((Protocol == MailProxyProtocolKind.Smtp && str.ToUpper().IndexOf("MAIL FROM:") == 0) ||
                            (Protocol == MailProxyProtocolKind.Pop3 && str.ToUpper().IndexOf("USER") == 0))
                        {
                            str          = Util.SwapStr(oneSpecialUser.Before, oneSpecialUser.After, str);
                            clientBuf[i] = Encoding.ASCII.GetBytes(str);
                            break;
                        }
                    }
                    Logger.Set(LogKind.Normal, client, 3, string.Format("{0}->{1} {2}:{3}", oneSpecialUser.Before, oneSpecialUser.After, _targetServer, _targetPort));
                }
            }

            //***************************************************************
            // サーバとの接続
            //***************************************************************
            {
                var port = _targetPort;
                //var ipList = new List<Ip>{new Ip(_targetServer)};
                //if(ipList[0].ToString() == "0.0.0.0") {
                //    ipList = Kernel.DnsCache.Get(_targetServer);
                //    if(ipList.Count == 0) {
                //        Logger.Set(LogKind.Normal,client,4,string.Format("{0}:{1}",_targetServer,_targetPort));
                //        goto end;
                //    }
                //}
                var ipList = Kernel.GetIpList(_targetServer);
                if (ipList.Count == 0)
                {
                    Logger.Set(LogKind.Normal, client, 4, string.Format("{0}:{1}", _targetServer, _targetPort));
                    goto end;
                }

                foreach (var ip in ipList)
                {
                    server = Inet.Connect(Kernel, ip, port, Timeout, null);
                    if (server != null)
                    {
                        break;
                    }
                }
                if (server == null)
                {
                    Logger.Set(LogKind.Normal, client, 5, string.Format("{0}:{1}", _targetServer, _targetPort));
                    goto end;
                }

                if (null == ConnectJob(client, server, clientBuf))//接続後の処理
                {
                    goto end;
                }
            }
            Logger.Set(LogKind.Normal, client, 4, string.Format("connect {0}:{1}", _targetServer, _targetPort));

            //***************************************************************
            //後処理(接続先・ユーザの取得と特別なユーザの置換)
            //***************************************************************

            foreach (byte[] buf in clientBuf)
            {
                //Ver5.2.5
                //byte[] serverBuf = server.LineRecv(timeout,OPERATE_CRLF.NO,ref life);

                //クライアントからの受信分を送信する
                server.LineSend(buf);
            }

            //***************************************************************
            // パイプ
            //***************************************************************
            var tunnel = new Tunnel(Logger, (int)Conf.Get("idleTime"), Timeout);

            tunnel.Pipe(server, client, this);
end:
            if (client != null)
            {
                client.Close();
            }
            if (server != null)
            {
                server.Close();
            }
        }