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(); }
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); }
//接続単位の処理 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(); } }