//TODO RecvCmd�̃p�����[�^�`����ύX���邪�A����́A��قǁAWeb,Ftp,Smtp��Server�Ŏg�p����Ă��邽�߉e�����ł�\�� //�R�}���h�擾 //�R�l�N�V�����ؒf�ȂǃG���[��������������null���Ԃ���� protected Cmd recvCmd(SockTcp sockTcp) { if (sockTcp.SockState != sock.SockState.Connect) { //�ؒf����Ă��� return(null); } var recvbuf = sockTcp.LineRecv(Timeout, this); //�ؒf���ꂽ�ꍇ if (recvbuf == null) { return(null); } //��M�ҋ@���̏ꍇ if (recvbuf.Length == 0) { //Ver5.8.5 Java fix //return new Cmd("", "", ""); return(new Cmd("waiting", "", "")); //�ҋ@���̏ꍇ�A���̂��Ƃ�������悤��"waiting"��Ԃ� } //CRLF�̔r�� recvbuf = Inet.TrimCrlf(recvbuf); //String str = new String(recvbuf, Charset.forName("Shift-JIS")); var str = Encoding.GetEncoding("Shift-JIS").GetString(recvbuf); if (str == "") { return(new Cmd("", "", "")); } //��M�s��R�}���h�ƃp�����[�^�ɕ������i�R�}���h�ƃp�����[�^�͂P�ȏ�̃X�y�[�X�ŋ���Ă���j String cmdStr = null; String paramStr = null; for (int i = 0; i < str.Length; i++) { if (str[i] == ' ') { if (cmdStr == null) { cmdStr = str.Substring(0, i); } } if (cmdStr == null || str[i] == ' ') { continue; } paramStr = str.Substring(i); break; } if (cmdStr == null) { //�p�����[�^��肪������Ȃ������ꍇ cmdStr = str; //�S���R�}���h } return(new Cmd(str, cmdStr, paramStr)); }
protected ToolDlg(Kernel kernel, string nameTag, Object obj, string caption) { InitializeComponent(); Kernel = kernel; NameTag = nameTag; _caption = caption; if (kernel.RunMode == RunMode.Remote) { sockTcp = (SockTcp)obj; } else { Server = (OneServer)obj; } Text = caption; //ウインドウサイズの復元 kernel.WindowSize.Read(this); //MainMenuFile.Text = (kernel.IsJp()) ? "ファイル(&F)" : "&File"; //MainMenuClose.Text = (kernel.IsJp()) ? "閉じる(&C)" : "&Close"; }
//���M //count �{���̍s���i-1�̂Ƃ��͑S���j public bool Send(SockTcp sockTcp, int count) { try { _header.ForEach(s => sockTcp.SendUseEncode(Encoding.ASCII.GetBytes(s))); sockTcp.SendUseEncode(Encoding.ASCII.GetBytes("\r\n"));//���s if (count == -1) { _body.ForEach(d => sockTcp.SendUseEncode(d)); } else { for (int i = 0; i < count && i < _body.Count; i++) { sockTcp.SendUseEncode(_body[i]); } } return(true); } catch (Exception ex) { //Ver5.9.2 SetLastError(ex.Message); return(false); } }
//TODO RecvCmdのパラメータ形式を変更するが、これは、後ほど、Web,Ftp,SmtpのServerで使用されているため影響がでる予定 //コマンド取得 //コネクション切断などエラーが発生した時はnullが返される protected Cmd recvCmd(SockTcp sockTcp) { if (sockTcp.SockState != sock.SockState.Connect) { //切断されている return(null); } var recvbuf = sockTcp.LineRecv(Timeout, this); //切断された場合 if (recvbuf == null) { return(null); } //受信待機中の場合 if (recvbuf.Length == 0) { //Ver5.8.5 Java fix //return new Cmd("", "", ""); return(new Cmd("waiting", "", "")); //待機中の場合、そのことが分かるように"waiting"を返す } //CRLFの排除 recvbuf = Inet.TrimCrlf(recvbuf); //String str = new String(recvbuf, Charset.forName("Shift-JIS")); var str = Encoding.GetEncoding("Shift-JIS").GetString(recvbuf); if (str == "") { return(new Cmd("", "", "")); } //受信行をコマンドとパラメータに分解する(コマンドとパラメータは1つ以上のスペースで区切られている) String cmdStr = null; String paramStr = null; for (int i = 0; i < str.Length; i++) { if (str[i] == ' ') { if (cmdStr == null) { cmdStr = str.Substring(0, i); } } if (cmdStr == null || str[i] == ' ') { continue; } paramStr = str.Substring(i); break; } if (cmdStr == null) { //パラメータ区切りが見つからなかった場合 cmdStr = str; //全部コマンド } return(new Cmd(str, cmdStr, paramStr)); }
//接続 public bool Connect() { if (Status != PopClientStatus.Idle) { SetLastError("Connect() Status != Idle"); return(false); } if (_ip.InetKind == InetKind.V4) { _sockTcp = Inet.Connect(_kernel, _ip, _port, _sec + 3, null); } else { _sockTcp = Inet.Connect(_kernel, _ip, _port, _sec + 3, null); } if (_sockTcp.SockState == SockState.Connect) { //+OK受信 if (!RecvStatus()) { return(false); } Status = PopClientStatus.Authorization; return(true); } SetLastError("Faild in PopClient Connect()"); return(false); }
private void Start() { Core.instance.Initialize(); sock = null; switchAfter = null; Property props = BuildOption.Instance.Props; if (props.isWebPlayer) { Security.PrefetchSocketPolicy(props.GetRoundRobinServer, 843); } try { IPAddress[] hostAddresses = Dns.GetHostAddresses(props.GetRoundRobinServer); if (hostAddresses != null && hostAddresses.Length > 0) { roundRobinIp = hostAddresses[0].ToString(); } } catch (Exception ex) { Debug.LogError(ex.Message.ToString()); Debug.LogError("Fail to dns look up, it will treat the address as an ip address"); roundRobinIp = props.GetRoundRobinServer; } }
//データの受信 //パラメータ cs CS.SERVER を設定した場合、buf[CS.SERVER]を処理対象とし、クライアント側に送信する bool RecvBuf(CS cs, ILife iLife) { SockTcp sock = Proxy.Sock(cs); if (sock == null)//サーバ側未接続 { return(true); } var len = sock.Length(); if (len == 0) { return(true); } var b = sock.Recv(len, Proxy.OptionTimeout, iLife); if (b == null) { return(false); } _oneObj.Body[cs].Add(b); _lastRecvServer = DateTime.Now.Ticks; return(true); }
//接続 public bool Connect() { if (Status != SmtpClientStatus.Idle) { SetLastError("Connect() Status != Idle"); return(false); } if (_ip.InetKind == InetKind.V4) { _sockTcp = Inet.Connect(new Kernel(), _ip, _port, _sec + 3, null); } else { _sockTcp = Inet.Connect(new Kernel(), _ip, _port, _sec + 3, null); } if (_sockTcp.SockState == SockState.Connect) { //220受信 if (!RecvStatus(220)) { return(false); } Status = SmtpClientStatus.Helo; return(true); } SetLastError("Faild in SmtpClient Connect()"); return(false); }
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); }
private int SendBinary(SockTcp sockTcp, String fileName) { var sb = new StringBuilder(); sb.Append(string.Format("SendBinary({0}) ", fileName)); int size = 0; using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)){ using (var br = new BinaryReader(fs)){ var buf = new byte[3000000]; while (IsLife()) { var len = br.Read(buf, 0, 3000000); if (len <= 0) { break; } //if (oneSsl != null) { //}else{ sockTcp.Send(buf, len); //} //�g���[�X�\�� sb.Append(string.Format("Binary={0}byte ", len)); size += len; } } } //noEncode = true; //�o�C�i���ł��鎖���������Ă��� //Trace(TraceKind.Send, Encoding.ASCII.GetBytes(sb.ToString()), true); //�g���[�X�\�� return(size); }
public void HeaderTest(string key, string val) { var request = new Request(null, null); var header = new Header(); header.Append("Connection", Encoding.ASCII.GetBytes("keep-alive")); header.Append("User-Agent", Encoding.ASCII.GetBytes("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)")); header.Append("Accept", Encoding.ASCII.GetBytes("text/html,application/xhtml")); header.Append("Accept-Encoding", Encoding.ASCII.GetBytes("gzip,deflate,sdch")); header.Append("Accept-Language", Encoding.ASCII.GetBytes("ja,en-US;q=0.8,en;q=0.6")); header.Append("Accept-Charset", Encoding.ASCII.GetBytes("Shift_JIS,utf-8;q=0.7,*;q=0.3")); header.Append("Cache-Control", Encoding.ASCII.GetBytes("max-age=0")); var tcpObj = new SockTcp(new Kernel(), new Ip("0.0.0.0"), 88, 3, null); const string fileName = ""; var env = new Env(_kernel, new Conf(option), request, header, tcpObj, fileName); foreach (var e in env) { if (e.Key == key) { Assert.AreEqual(e.Val, val); return; } } Assert.AreEqual(key, ""); }
public void OtherTest(string key, string val) { var request = new Request(null, null); var header = new Header(); var tcpObj = new SockTcp(new Kernel(), new Ip(IpKind.V4_0), 88, 3, null); const string fileName = ""; var env = new Env(_kernel, new Conf(option), request, header, tcpObj, fileName); foreach (var e in env) { if (e.Key == key) { if (e.Key == "SERVER_SOFTWARE" && e.Val.IndexOf(".1478") > 0) { Assert.AreEqual(e.Val.ToLower(), "BlackJumboDog/7.1.2000.1478 (Windows)".ToLower()); } else { Assert.AreEqual(e.Val.ToLower(), val.ToLower()); } return; } } Assert.AreEqual(key, ""); }
void Pipe() { _sockTcp = SockServer.CreateConnection(_kernel, _ip, _listenPort, null, this); if (_sockTcp != null) { while (_life) { var len = _sockTcp.Length(); if (len > 0) { const int tout = 3; //受信バイト数がわかっているので、ここでのタイムアウト値はあまり意味が無い var b = _sockTcp.Recv(len, tout, this); if (b != null) { _buffer = Bytes.Create(_buffer, b); } } if (_sockTcp.Length() == 0 && _sockTcp.SockState != SockState.Connect) { break; } } _sockTcp.Close(); } IsRecv = false; }
public void Echoサーバに送信して溜まったデータサイズ_lengthを確認する() { //setUp const string addr = "127.0.0.1"; const int port = 9982; var sv = new EchoServer(addr, port); sv.Start(); var sut = new SockTcp(new Kernel(), new Ip(addr), port, 100, null); const int max = 1000; for (int i = 0; i < 3; i++) { sut.Send(new byte[max]); } Thread.Sleep(200); int expected = max * 3; //exercise var actual = sut.Length(); //verify Assert.That(actual, Is.EqualTo(expected)); //tearDown sut.Close(); sv.Stop(); }
private void Ehlo(SockTcp cl) { var localPort = cl.LocalAddress.Port; //なぜかローカルのポートアドレスは1つ小さい //バナー const string bannerStr = "220 localhost SMTP BlackJumboDog "; Assert.That(cl.StringRecv(3, this).Substring(0, 33), Is.EqualTo(bannerStr)); //EHLO cl.StringSend("EHLO 1"); var lines = Inet.RecvLines(cl, 4, this); var str = string.Format("250-localhost Helo 127.0.0.1[127.0.0.1:{0}], Pleased to meet you.", localPort); if (cl.LocalAddress.Address.ToString() == "::1") { str = string.Format("250-localhost Helo ::1[[::1]:{0}], Pleased to meet you.", localPort); } Assert.That(lines[0], Is.EqualTo(str)); Assert.That(lines[1], Is.EqualTo("250-8BITMIME")); Assert.That(lines[2], Is.EqualTo("250-SIZE=5000")); Assert.That(lines[3], Is.EqualTo("250-AUTH LOGIN PLAIN CRAM-MD5")); Assert.That(lines[4], Is.EqualTo("250 HELP")); }
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(); }
public void EchoサーバにstringSendで1行送信してstringRecvで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.StringSend("本日は晴天なり", "UTF-8"); Thread.Sleep(10); var expected = "本日は晴天なり\r\n"; //exercise var actual = sut.StringRecv("UTF-8", 1, this); //verify Assert.That(actual, Is.EqualTo(expected)); //tearDown sut.Close(); sv.Stop(); }
//共通処理(バナーチェック) Resharperのバージョンを吸収 // private void CheckBanner(string str) { // //テストの際は、バージョン番号はテストツール(ReSharper)のバージョンになる // const string bannerStr1 = "xxx"; // const string bannerStr2 = "+OK BlackJumboDog (Version 7.1.2000.1478) ready <"; // // // //Assert.That(_v6cl.StringRecv(3, this), Is.EqualTo(BannerStr)); // // if (str != bannerStr1 && str.IndexOf(bannerStr2) != 0) { // Assert.Fail(); // } // } // //共通処理(ログイン成功) //ユーザ名、メール蓄積数、蓄積サイズ void Login(string userName, string password, int n, int size, SockTcp cl) { Assert.That(cl.StringRecv(3, this), Is.EqualTo("+OK \r\n")); cl.StringSend(string.Format("USER {0}", userName)); Assert.That(cl.StringRecv(3, this), Is.EqualTo(string.Format("+OK Password required for {0}.\r\n", userName))); cl.StringSend(string.Format("PASS {0}", password)); Assert.That(cl.StringRecv(10, this), Is.EqualTo(string.Format("+OK {0} has {1} message ({2} octets).\r\n", userName, n, size))); }
public void Dispose() { if (_sockTcp != null) { _sockTcp.Close(); _sockTcp = null; } }
SockTcp StartClient(int port) { var ip = TestUtil.CreateIp("127.0.0.1"); var cl = new SockTcp(new Kernel(), ip, port, 300, null); Thread.Sleep(300); return(cl); }
public void SetUp() { //クライアント起動 _v4Cl = Inet.Connect(new Kernel(), new Ip(IpKind.V4Localhost), 21, 10, null); _v6Cl = Inet.Connect(new Kernel(), new Ip(IpKind.V6Localhost), 21, 10, null); //クライアントの接続が完了するまで、少し時間がかかる //Thread.Sleep(10); }
void TcpTunnel(SockTcp tcpObj) { var client = tcpObj; SockTcp server = null; //*************************************************************** // �T�[�o�Ƃ̐ڑ� //*************************************************************** { 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,null,4,string.Format("{0}:{1}",_targetServer,_targetPort)); // goto end; // } //} var ipList = Kernel.GetIpList(_targetServer); if (ipList.Count == 0) { Logger.Set(LogKind.Normal, null, 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, server, 5, string.Format("{0}:{1}", _targetServer, _targetPort)); goto end; } } Logger.Set(LogKind.Normal, server, 6, string.Format("TCP {0}:{1} - {2}:{3}", client.RemoteHostname, client.RemoteAddress.Port, _targetServer, _targetPort)); //*************************************************************** // �p�C�v //*************************************************************** 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(); } }
public Session(SockTcp sockCtrl) { SockCtrl = sockCtrl; //PASV接続用ポート番号の初期化 (開始番号は2000~9900) var rnd = new Random(); Port = (rnd.Next(79) + 20) * 100; }
//共通処理(ログイン成功) private void Login(string userName, SockTcp cl) { CheckBanner(cl.StringRecv(1, this));//バナーチェック cl.StringSend(string.Format("USER {0}", userName)); Assert.That(cl.StringRecv(1, this), Is.EqualTo(string.Format("331 Password required for {0}.\r\n", userName))); cl.StringSend(string.Format("PASS {0}", userName)); Assert.That(cl.StringRecv(10, this), Is.EqualTo(string.Format("230 User {0} logged in.\r\n", userName))); }
//送信 bool Send(SockTcp sock, byte[] sendBuf) { var c = sock.SendUseEncode(sendBuf); if (c != sendBuf.Length) { return(false); } return(true); }
public void OneServerを継承したEchoServer_TCP版_を使用して接続する() { const string addr = "127.0.0.1"; const int port = 9999; const int timeout = 300; Ip ip = null; try{ ip = new Ip(addr); } catch (ValidObjException ex) { Assert.Fail(ex.Message); } var oneBind = new OneBind(ip, ProtocolKind.Tcp); var conf = TestUtil.CreateConf("OptionSample"); conf.Set("port", port); conf.Set("multiple", 10); conf.Set("acl", new Dat(new CtrlType[0])); conf.Set("enableAcl", 1); conf.Set("timeOut", timeout); var echoServer = new EchoServer(conf, oneBind); echoServer.Start(); //TCPクライアント const int max = 10000; var buf = new byte[max]; buf[8] = 100; //CheckData for (int i = 0; i < 3; i++) { var sockTcp = new SockTcp(new Kernel(), ip, port, timeout, null); sockTcp.Send(buf); while (sockTcp.Length() == 0) { Thread.Sleep(2); } var len = sockTcp.Length(); if (0 < len) { var b = sockTcp.Recv(len, timeout, this); Assert.That(b[8], Is.EqualTo(buf[8]));//CheckData } Assert.That(max, Is.EqualTo(len)); sockTcp.Close(); } echoServer.Dispose(); }
public bool WaitLine(SockTcp sockTcp, ref string cmdStr, ref string paramStr) { var cmd = WaitLine(sockTcp); if (cmd == null) { return(false); } cmdStr = cmd.CmdStr; paramStr = cmd.ParamStr; return(true); }
public void SetUp() { var kernel = new Kernel(); var ip = new Ip("127.0.0.1"); const int port = 0; Ssl ssl = null; var tcpObj = new SockTcp(new Kernel(), ip, port, 3, ssl); var upperProxy = new UpperProxy(false, "", 0, null, false, "", "");//上位プロキシ未使用 const int timeout = 3; _proxy = new Proxy(kernel, null, tcpObj, timeout, upperProxy); }
//データ取得(内部データは、初期化される) public bool Recv(Logger logger, SockTcp sockTcp, int timeout, ILife iLife) { _logger = logger; //int limit = 3600;//文字数制限 var str = sockTcp.AsciiRecv(timeout, iLife); if (str == null) { return(false); } return(Interpretation(Inet.TrimCrlf(str))); }
void AuthError(SockTcp sockTcp, string user, string pass) { Logger.Set(LogKind.Secure, sockTcp, 3, string.Format("user={0} pass={1}", user, pass)); // �F�̃G���[�͂����ɕԓ���Ԃ��Ȃ� var authTimeout = (int)Conf.Get("authTimeout"); for (int i = 0; i < (authTimeout * 10) && IsLife(); i++) { Thread.Sleep(100); } sockTcp.AsciiSend(string.Format("-ERR Password supplied for {0} is incorrect.", user)); }