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 STOR_DELEマンド_V6() { var cl = _v6Cl; //共通処理(ログイン成功) Login("user1", cl); //port var port = 249; cl.StringSend("PORT 127,0,0,1,0,249"); var dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V4Localhost), port, null, this); Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 PORT command successful.\r\n")); //stor cl.StringSend("STOR 0.txt"); Assert.That(cl.StringRecv(1, this), Is.EqualTo("150 Opening ASCII mode data connection for 0.txt.\r\n")); dl.Send(new byte[3]); dl.Close(); Assert.That(cl.StringRecv(1, this), Is.EqualTo("226 Transfer complete.\r\n")); //dele cl.StringSend("DELE 0.txt"); Assert.That(cl.StringRecv(1, this), Is.EqualTo("250 Dele command successful.\r\n")); }
public void LISTコマンド_V6() { var cl = _v6Cl; //共通処理(ログイン成功) Login("user1", cl); //port var port = 251; cl.StringSend("PORT 127,0,0,1,0,251"); var dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V4Localhost), port, null, this); Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 PORT command successful.\r\n")); //list cl.StringSend("LIST -la"); Assert.That(cl.StringRecv(1, this), Is.EqualTo("150 Opening ASCII mode data connection for ls.\r\n")); Assert.That(listMask(dl.StringRecv(3, this)), Is.EqualTo("drwxrwxrwx 1 nobody nogroup nnnn mon dd hh:mm home0\r\n")); Assert.That(listMask(dl.StringRecv(3, this)), Is.EqualTo("drwxrwxrwx 1 nobody nogroup nnnn mon dd hh:mm home1\r\n")); Assert.That(listMask(dl.StringRecv(3, this)), Is.EqualTo("drwxrwxrwx 1 nobody nogroup nnnn mon dd hh:mm home2\r\n")); Assert.That(listMask(dl.StringRecv(3, this)), Is.EqualTo("-rwxrwxrwx 1 nobody nogroup nnnn mon dd hh:mm 1.txt\r\n")); Assert.That(listMask(dl.StringRecv(3, this)), Is.EqualTo("-rwxrwxrwx 1 nobody nogroup nnnn mon dd hh:mm 2.txt\r\n")); Assert.That(listMask(dl.StringRecv(3, this)), Is.EqualTo("-rwxrwxrwx 1 nobody nogroup nnnn mon dd hh:mm 3.txt\r\n")); dl.Close(); }
private bool JobPasv(Session session, FtpCmd ftpCmd) { var port = session.Port; var ip = session.SockCtrl.LocalIp; // �f�[�^�X�g���[���̃\�P�b�g�̍쐬 for (int i = 0; i < 100; i++) { port++; if (port >= 9999) { port = 2000; } //�o�C���h�\���ǂ����̊m�F if (SockServer.IsAvailable(Kernel, ip, port)) { //���� if (ftpCmd == FtpCmd.Epsv) { //Java fix Ver5.8.3 //session.StringSend(string.Format("229 Entering Extended Passive Mode. (|||{0}|)", port)); session.StringSend(string.Format("229 Entering Extended Passive Mode (|||{0}|)", port)); } else { var ipStr = ip.ToString(); //Java fix Ver5.8.3 //session.StringSend(string.Format("227 Entering Passive Mode. ({0},{1},{2})", ipStr.Replace('.',','), port/256, port%256)); session.StringSend(string.Format("227 Entering Passive Mode ({0},{1},{2})", ipStr.Replace('.', ','), port / 256, port % 256)); } //�w�肵���A�h���X�E�|�[�g�ő҂��� var sockData = SockServer.CreateConnection(Kernel, ip, port, null, this); if (sockData == null) { //�ڑ����s return(false); } if (sockData.SockState != Bjd.sock.SockState.Error) { //�Z�b�V�������̕ۑ� session.Port = port; session.SockData = sockData; return(true); } } } session.StringSend("500 command not understood:"); return(true); }
private bool JobPasv(Session session, FtpCmd ftpCmd) { var port = session.Port; var ip = session.SockCtrl.LocalIp; // データストリームのソケットの作成 for (int i = 0; i < 100; i++) { port++; if (port >= 9999) { port = 2000; } //バインド可能かどうかの確認 if (SockServer.IsAvailable(Kernel, ip, port)) { //成功 if (ftpCmd == FtpCmd.Epsv) { //Java fix Ver5.8.3 //session.StringSend(string.Format("229 Entering Extended Passive Mode. (|||{0}|)", port)); session.StringSend(string.Format("229 Entering Extended Passive Mode (|||{0}|)", port)); } else { var ipStr = ip.ToString(); //Java fix Ver5.8.3 //session.StringSend(string.Format("227 Entering Passive Mode. ({0},{1},{2})", ipStr.Replace('.',','), port/256, port%256)); session.StringSend(string.Format("227 Entering Passive Mode ({0},{1},{2})", ipStr.Replace('.', ','), port / 256, port % 256)); } //指定したアドレス・ポートで待ち受ける var sockData = SockServer.CreateConnection(Kernel, ip, port, null, this); if (sockData == null) { //接続失敗 return(false); } if (sockData.SockState != Bjd.sock.SockState.Error) { //セッション情報の保存 session.Port = port; session.SockData = sockData; return(true); } } } session.StringSend("500 command not understood:"); return(true); }
public new void Stop() { if (_sockServer == null) { return; //すでに終了処理が終わっている } base.Stop(); //life=false すべてのループを解除する _sockServer.Close(); // 全部の子スレッドが終了するのを待つ while (Count() > 0) { Thread.Sleep(500); } _sockServer = null; }
public new void Stop() { if (_sockServer == null) { return; //���łɏI���������I����Ă��� } base.Stop(); //life=false �ł��ׂẴ��[�v�������� _sockServer.Close(); // �S���̎q�X���b�h���I������̂�҂� while (Count() > 0) { Thread.Sleep(500); } _sockServer = null; }
public void PORTコマンド() { var cl = _v4Cl; //共通処理(ログイン成功) Login("user1", cl); int port = 256; //テストの連続のためにPORTコマンドのテストとはポート番号をずらす必要がある cl.StringSend("PORT 127,0,0,1,0,256"); SockTcp dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V4Localhost), port, null, this); Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 PORT command successful.\r\n")); dl.Close(); }
public void EPRTコマンド() { var cl = _v6Cl; //共通処理(ログイン成功) Login("user1", cl); var port = 252; //テストの連続のためにPORTコマンドのテストとはポート番号をずらす必要がある cl.StringSend("EPRT |2|::1|252|"); var dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V6Localhost), port, null, this); Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 EPRT command successful.\r\n")); dl.Close(); }
public void getLocalAddress(String title, ProtocolKind protocolKind) { var bindIp = new Ip(IpKind.V4Localhost); const int port = 9991; const int listenMax = 10; Ssl ssl = null; var sockServer = new SockServer(new Kernel(), protocolKind, ssl); ThreadStart action = () => { if (protocolKind == ProtocolKind.Tcp) { sockServer.Bind(bindIp, port, listenMax); } else { sockServer.Bind(bindIp, port); } }; var _t = new Thread(action) { IsBackground = true }; _t.Start(); while (sockServer.SockState == SockState.Idle) { Thread.Sleep(200); } var localAddress = sockServer.LocalAddress; Assert.That(localAddress.ToString(), Is.EqualTo("127.0.0.1:9991")); //bind()後 localAddressの取得が可能になる var remoteAddress = sockServer.RemoteAddress; Assert.IsNull(remoteAddress); //SockServerでは、remoteAddressは常にnullになる sockServer.Close(); }
protected override void OnRunThread() { ThreadBaseKind = ThreadBaseKind.Running; int timeout = 3; _sock[CS.Client] = new SockTcp(_kernel, _connectIp, _connectPort, timeout, null); _sock[CS.Server] = SockServer.CreateConnection(_kernel, _listenIp, _listenPort, null, this); while (IsLife()) { for (var i = 0; i < 2; i++) { var cs = (i == 0) ? CS.Server : CS.Client; if (_buf[cs].Length == 0) { var len = _sock[cs].Length(); if (len != 0) { _tunnel.ResetIdle();//アイドル時間の更新 _buf[cs] = _sock[cs].Recv(len, 1, this); } } if (_buf[cs].Length != 0) { var s = _sock[((i == 0) ? CS.Client : CS.Server)].Send(_buf[cs]); if (-1 != s) { _buf[cs] = new byte[0]; } } } if (_sock[CS.Server].SockState != SockState.Connect && _sock[CS.Server].Length() == 0) { break; } if (_sock[CS.Client].SockState != SockState.Connect && _sock[CS.Client].Length() == 0) { break; } } _sock[CS.Client].Close(); _sock[CS.Server].Close(); }
public void DOWNユーザはSTORに失敗する_V6() { var cl = _v6Cl; //共通処理(ログイン成功) Login("user3", cl); //port var port = 249; cl.StringSend("PORT 127,0,0,1,0,249"); var dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V4Localhost), port, null, this); Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 PORT command successful.\r\n")); //stor cl.StringSend("STOR 0.txt"); Assert.That(cl.StringRecv(1, this), Is.EqualTo("550 Permission denied.\r\n")); }
protected override void OnRunThread() { var port = (int)Conf.Get("port"); var bindStr = string.Format("{0}:{1} {2}", _oneBind.Addr, port, _oneBind.Protocol); Logger.Set(LogKind.Normal, null, 9000000, bindStr); //DOSを受けた場合、multiple数まで連続アクセスまでは記憶してしまう //DOSが終わった後も、その分だけ復帰に時間を要する //Ver5.9,2 Java fix //_sockServer = new SockServer(this.Kernel,_oneBind.Protocol); _sockServer = new SockServer(Kernel, _oneBind.Protocol, ssl); //Ver5.9.2 Java fix if (ssl != null && !ssl.Status) { Logger.Set(LogKind.Error, null, 9000024, bindStr); //[C#] ThreadBaseKind = ThreadBaseKind.Running; } else { if (_sockServer.SockState != sock.SockState.Error) { if (_sockServer.ProtocolKind == ProtocolKind.Tcp) { RunTcpServer(port); } else { RunUdpServer(port); } } } //Java fix _sockServer.Close(); Logger.Set(LogKind.Normal, null, 9000001, bindStr); }
protected override void OnRunThread() { var port = (int)Conf.Get("port"); var bindStr = string.Format("{0}:{1} {2}", _oneBind.Addr, port, _oneBind.Protocol); Logger.Set(LogKind.Normal, null, 9000000, bindStr); //DOS����ꍇ�Amultiple���܂ŘA���A�N�Z�X�܂ł͋L�����Ă��܂� //DOS���I��������A���̕��������A�Ɏ��Ԃ�v���� //Ver5.9,2 Java fix //_sockServer = new SockServer(this.Kernel,_oneBind.Protocol); _sockServer = new SockServer(Kernel, _oneBind.Protocol, ssl); //Ver5.9.2 Java fix if (ssl != null && !ssl.Status) { Logger.Set(LogKind.Error, null, 9000024, bindStr); //[C#] ThreadBaseKind = ThreadBaseKind.Running; } else { if (_sockServer.SockState != sock.SockState.Error) { if (_sockServer.ProtocolKind == ProtocolKind.Tcp) { RunTcpServer(port); } else { RunUdpServer(port); } } } //Java fix _sockServer.Close(); Logger.Set(LogKind.Normal, null, 9000001, bindStr); }
public void startStop(String title, ProtocolKind protocolKind) { var bindIp = new Ip(IpKind.V4Localhost); const int port = 8881; const int listenMax = 10; Ssl ssl = null; var sockServer = new SockServer(new Kernel(), protocolKind, ssl); Assert.That(sockServer.SockState, Is.EqualTo(SockState.Idle)); ThreadStart action = () => { if (protocolKind == ProtocolKind.Tcp) { sockServer.Bind(bindIp, port, listenMax); } else { sockServer.Bind(bindIp, port); } }; var _t = new Thread(action) { IsBackground = true }; _t.Start(); while (sockServer.SockState == SockState.Idle) { Thread.Sleep(100); } Assert.That(sockServer.SockState, Is.EqualTo(SockState.Bind)); sockServer.Close(); //bind()にThreadBaseのポインタを送っていないため、isLifeでブレイクできないので、selectで例外を発生させて終了する Assert.That(sockServer.SockState, Is.EqualTo(SockState.Error)); }
public void UPユーザはRETRに失敗する_V6() { var cl = _v6Cl; //共通処理(ログイン成功) Login("user2", cl); //port var port = 250; cl.StringSend("PORT 127,0,0,1,0,250"); var dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V4Localhost), port, null, this); Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 PORT command successful.\r\n")); //retr cl.StringSend("RETR 3.txt"); Assert.That(cl.StringRecv(1, this), Is.EqualTo("550 Permission denied.\r\n")); // Thread.Sleep(10); // Assert.That(dl.Length, Is.EqualTo(24)); dl.Close(); }
public void RETRコマンド_V6() { var cl = _v6Cl; //共通処理(ログイン成功) Login("user1", cl); //port var port = 250; cl.StringSend("PORT 127,0,0,1,0,250"); var dl = SockServer.CreateConnection(new Kernel(), new Ip(IpKind.V4Localhost), port, null, this); Assert.That(cl.StringRecv(1, this), Is.EqualTo("200 PORT command successful.\r\n")); //retr cl.StringSend("RETR 3.txt"); Assert.That(cl.StringRecv(1, this), Is.EqualTo("150 Opening ASCII mode data connection for 3.txt (24 bytes).\r\n")); Thread.Sleep(10); Assert.That(dl.Length(), Is.EqualTo(24)); dl.Close(); }
//サーバ側若しくはクライアント側どちらかのSockTcpは、Listen状態で生成が終わっている //そして、その接続の待ち受け開始は、このクラスの中で行われる //接続が完了した後、反対側のサーバ(Ip,port)へ、コネクトする public DataThread(Kernel kernel, Logger logger, int clientPort, int serverPort, Ip bindAddr, Ip ip, int port, int timeout) { _kernel = kernel; _logger = logger; _timeout = timeout; _ip = ip; _port = port; _sock[CS.Client] = null; _sock[CS.Server] = null; if (serverPort != 0) //サーバ側がListen状態の場合 PASV { _sock[CS.Server] = SockServer.CreateConnection(kernel, bindAddr, serverPort, null, this); if (_sock[CS.Server] == null) { return; } } else if (clientPort != 0) //クライアント側がListen状態の場合 PORT { _sock[CS.Client] = SockServer.CreateConnection(kernel, bindAddr, clientPort, null, this); if (_sock[CS.Client] == null) { return; } } //パイプスレッドの生成 _t = new Thread(Pipe) { IsBackground = true }; _t.Start(); }
//protected override byte[] AssumptionLine(byte[] buf,ILife iLife) { byte[] AssumptionLine(byte[] buf, ILife iLife) { //stringに変換してから処理する var str = Encoding.ASCII.GetString(buf); Logger.Set(LogKind.Detail, null, 7, str); var index = str.IndexOf(" "); if (index < 0) { goto end; } var cmdStr = str.Substring(0, index); var paramStr = str.Substring(index + 1); if (cmdStr == "227") { //PASVに対するレスポンス //********************************************************************** // 「PASV 192.168.22.102,23,15」コマンドからサーバ側の情報を取得する //********************************************************************** var tmp2 = paramStr.Split('(', ')'); if (tmp2.Length != 3) { Logger.Set(LogKind.Error, null, 5, str); goto end; } string[] tmp = tmp2[1].Split(','); if (tmp.Length != 6) { Logger.Set(LogKind.Error, null, 6, str); goto end; } var connectIp = new Ip(string.Format("{0}.{1}.{2}.{3}", tmp[0], tmp[1], tmp[2], tmp[3])); var connectPort = Convert.ToInt32(tmp[4]) * 256 + Convert.ToInt32(tmp[5]); //********************************************************************** // クライアント側用のListenソケットを生成する //********************************************************************** var listenIp = Sock[CS.Client].LocalIp; // 利用可能なデータポートの選定 int listenPort = 0; while (iLife.IsLife()) { _dataPort++; if (SockServer.IsAvailable(_kernel, listenIp, _dataPort)) { listenPort = _dataPort; break; } } //********************************************************************** // クライアント側に送る227レスポンスを生成する //********************************************************************** str = string.Format("227 Entering Passive Mode ({0},{1},{2},{3},{4},{5})\r\n", listenIp.IpV4[0], listenIp.IpV4[1], listenIp.IpV4[2], listenIp.IpV4[3], listenPort / 256, listenPort % 256); buf = Encoding.ASCII.GetBytes(str); //データスレッドの準備 if (_dataTunnel != null) { _dataTunnel.Dispose(); } _dataTunnel = new DataTunnel(_kernel, Logger, listenIp, listenPort, connectIp, connectPort, this); _dataTunnel.Start(); Thread.Sleep(3); //Listenが完了してから 227を送信する } else if (cmdStr == "226") //Transfer complete. //_dataTunnel.WaitComplate(); //Thread.Sleep(10); //_dataTunnel.Stop(); { } else if (cmdStr.ToUpper() == "PORT") { //********************************************************************** //「PORT 192.168.22.102,23,15」コマンドからクライアント側の情報を取得する //********************************************************************** var tmp = paramStr.Split(','); if (tmp.Length != 6) { Logger.Set(LogKind.Error, null, 4, str); goto end; } var connectIp = new Ip(string.Format("{0}.{1}.{2}.{3}", tmp[0], tmp[1], tmp[2], tmp[3])); var connectPort = Convert.ToInt32(tmp[4]) * 256 + Convert.ToInt32(tmp[5]); //********************************************************************** // サーバ側用のListenソケットを生成する //********************************************************************** var listenIp = Sock[CS.Server].LocalIp; // 利用可能なデータポートの選定 int listenPort = 0; while (iLife.IsLife()) { _dataPort++; if (SockServer.IsAvailable(_kernel, listenIp, _dataPort)) { listenPort = _dataPort; break; } } //********************************************************************** // サーバ側に送るPORTコマンドを生成する //********************************************************************** //置き換えたPORTコマンドをセットする str = string.Format("PORT {0},{1},{2},{3},{4},{5}\r\n", listenIp.IpV4[0], listenIp.IpV4[1], listenIp.IpV4[2], listenIp.IpV4[3], listenPort / 256, listenPort % 256); buf = Encoding.ASCII.GetBytes(str); //データスレッドの準備 if (_dataTunnel != null) { _dataTunnel.Dispose(); } _dataTunnel = new DataTunnel(_kernel, Logger, listenIp, listenPort, connectIp, connectPort, this); _dataTunnel.Start(); Thread.Sleep(3); //Listenが完了してから PORTを送信する } end: return(buf); }
public EchoServer(String addr, int port) : base(null) { _sockServer = new SockServer(new Kernel(), ProtocolKind.Udp, _ssl); _addr = addr; _port = port; }
//プロキシ処理 override public bool Pipe(ILife iLife) { DataThread dataThread = null; var paramStr = ""; //サーバ側との接続処理 if (!Proxy.Connect(iLife, _oneObj.Request.HostName, _oneObj.Request.Port, _oneObj.Request.RequestStr, _oneObj.Request.Protocol)) { Proxy.Logger.Set(LogKind.Debug, null, 999, "□Break proxy.Connect()==false"); return(false); } //wait 220 welcome if (!WaitLine("220", ref paramStr, iLife)) { return(false); } Proxy.Sock(CS.Server).AsciiSend(string.Format("USER {0}", _user)); if (!WaitLine("331", ref paramStr, iLife)) { return(false); } Proxy.Sock(CS.Server).AsciiSend(string.Format("PASS {0}", _pass)); if (!WaitLine("230", ref paramStr, iLife)) { return(false); } //Ver5.6.6 if (_path == "/") { Proxy.Sock(CS.Server).AsciiSend("PWD"); if (!WaitLine("257", ref paramStr, iLife)) { return(false); } var tmp = paramStr.Split(' '); if (tmp.Length >= 1) { _path = tmp[0].Trim(new[] { '"' }); if (_path[_path.Length - 1] != '/') { _path = _path + "/"; } } } //リクエスト if (_path != "") { Proxy.Sock(CS.Server).AsciiSend(string.Format("CWD {0}", _path)); if (!WaitLine("250", ref paramStr, iLife)) { goto end; } } Proxy.Sock(CS.Server).AsciiSend(_file == "" ? "TYPE A" : "TYPE I"); if (!WaitLine("200", ref paramStr, iLife)) { goto end; } //PORTコマンド送信 var bindAddr = Proxy.Sock(CS.Server).LocalIp; // 利用可能なデータポートの選定 while (iLife.IsLife()) { DataPort++; if (DataPort >= 9999) { DataPort = 2000; } if (SockServer.IsAvailable(_kernel, bindAddr, DataPort)) { break; } } int listenPort = DataPort; //データスレッドの生成 dataThread = new DataThread(_kernel, bindAddr, listenPort); // サーバ側に送るPORTコマンドを生成する string str = string.Format("PORT {0},{1},{2},{3},{4},{5}", bindAddr.IpV4[0], bindAddr.IpV4[1], bindAddr.IpV4[2], bindAddr.IpV4[3], listenPort / 256, listenPort % 256); Proxy.Sock(CS.Server).AsciiSend(str); if (!WaitLine("200", ref paramStr, iLife)) { goto end; } if (_file == "") { Proxy.Sock(CS.Server).AsciiSend("LIST"); if (!WaitLine("150", ref paramStr, iLife)) { goto end; } } else { Proxy.Sock(CS.Server).AsciiSend("RETR " + _file); if (!WaitLine("150", ref paramStr, iLife)) { goto end; } } //Ver5.0.2 while (iLife.IsLife()) { if (!dataThread.IsRecv) { break; } } if (!WaitLine("226", ref paramStr, iLife)) { goto end; } byte[] doc; if (_file == "") { //受信結果をデータスレッドから取得する List <string> lines = Inet.GetLines(dataThread.ToString()); //FTPサーバから取得したLISTの情報をHTMLにコンバートする doc = ConvFtpList(lines, _path); } else { doc = dataThread.ToBytes(); } //クライアントへリプライ及びヘッダを送信する var header = new Header(); header.Replace("Server", Util.SwapStr("$v", _kernel.Ver.Version(), (string)_conf.Get("serverHeader"))); header.Replace("MIME-Version", "1.0"); if (_file == "") { header.Replace("Date", Util.UtcTime2Str(DateTime.UtcNow)); header.Replace("Content-Type", "text/html"); } else { header.Replace("Content-Type", "none/none"); } header.Replace("Content-Length", doc.Length.ToString()); Proxy.Sock(CS.Client).AsciiSend("HTTP/1.0 200 OK"); //リプライ送信 Proxy.Sock(CS.Client).SendUseEncode(header.GetBytes()); //ヘッダ送信 Proxy.Sock(CS.Client).SendNoEncode(doc); //ボディ送信 end: if (dataThread != null) { dataThread.Dispose(); } return(false); }