Example #1
0
        public void Echoサーバにsendしてlength分ずつRecvする()
        {
            //setUp
            const string addr = "127.0.0.1";
            const int port = 53;
            var echoServer = new EchoServer(addr, port);
            echoServer.Start();

            const int timeout = 3;

            const int max = 1500;
            const int loop = 10;
            var tmp = new byte[max];
            for (int i = 0; i < max; i++){
                tmp[i] = (byte) i;
            }

            var ip = new Ip(addr);
            for (var i = 0; i < loop; i++){
                var sockUdp = new SockUdp(new Kernel(), ip, port, null, tmp);
            //                while (sockUdp.Length() == 0){
            //                    Thread.Sleep(10);
            //                }
                var b = sockUdp.Recv(timeout);

                //verify
                for (var m = 0; m < max; m += 10){
                    Assert.That(b[m], Is.EqualTo(tmp[m])); //送信したデータと受信したデータが同一かどうかのテスト
                }
                sockUdp.Close();
            }

            //TearDown
            echoServer.Stop();
        }
Example #2
0
        public SockObj Select(ILife iLife)
        {
            while (iLife.IsLife())
            {
                if (sockQueue.Count > 0)
                {
                    IAsyncResult ar = sockQueue.Dequeue();

                    if (ProtocolKind == ProtocolKind.Udp)
                    {
                        SockUdp sockUdp = null;
                        var     ep      = (EndPoint) new IPEndPoint(IPAddress.Any, 0);
                        try{
                            int len = _socket.EndReceiveFrom(ar, ref ep);
                            sockUdp = new SockUdp(Kernel, _socket, _udpBuf, len, (IPEndPoint)ep); //ACCEPT
                        } catch (Exception) {
                            sockUdp = null;
                        }
                        //受信開始
                        BeginReceive();
                        return(sockUdp);
                    }
                    else
                    {
                        //自分自身を複製するため、いったん別のSocketで受け取る必要がある
                        var newSocket = _socket.EndAccept(ar); //ACCEPT

                        //受信開始
                        BeginReceive();

                        //Ver5.9.2 Java fix
                        //return new SockTcp(Kernel, newSocket);
                        return(new SockTcp(Kernel, _ssl, newSocket));
                    }
                }
                //Ver5.8.1
                //Thread.Sleep(0);
                Thread.Sleep(1);
            }
            SetError("isLife()==false");
            return(null);
        }
Example #3
0
 //���X�|���X�p�P�b�g�̑��M
 void Send(SockUdp sockUdp,PacketDhcp sp)
 {
     //���M
     sockUdp.Send(sp.GetBuffer());
     //this.Logger.Set(LogKind.Detail,sockUdp,4,string.Format("{0} {1} {2}",sp.Mac,(sp.RequestIp == null) ? "0.0.0.0" : sp.RequestIp.ToString(),sp.Type.ToString()));
     Log(sockUdp, 4, sp.Mac,sp.RequestIp,sp.Type);
 }
Example #4
0
 void Log(SockUdp sockUdp,int messageNo, Mac mac,Ip ip,DhcpType type)
 {
     string macStr = mac.ToString();
     foreach (var m in _macAcl) {
         if (m.StrList[0].ToUpper() == mac.ToString()) {
             macStr = string.Format("{0}({1})",mac,m.StrList[2]);
             break;
         }
     }
     Logger.Set(LogKind.Detail, sockUdp, messageNo, string.Format("{0} {1} {2}", macStr, (ip == null) ? "0.0.0.0" : ip.ToString(), type.ToString()));
 }
Example #5
0
        public void OneServerを継承したEchoServer_UDP版_を使用して接続する()
        {
            const string addr = "127.0.0.1";
            const int port = 9991;
            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.Udp);
            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 = 1600;
            var buf = new byte[max];
            buf[8] = 100; //CheckData

            for (int i = 0; i < 3; i++){
                var sockUdp = new SockUdp(new Kernel(), ip, port, null, buf);
                var b = sockUdp.Recv(timeout);
                Assert.That(b[8], Is.EqualTo(buf[8])); //CheckData
                Assert.That(max,  Is.EqualTo(b.Length));

                sockUdp.Close();
            }

            echoServer.Dispose();
        }
Example #6
0
 private void Udp(SockUdp sockUdp)
 {
     var buf = sockUdp.RecvBuf;
     sockUdp.Send(buf);
     //echoしたらセッションを閉じる
 }
Example #7
0
        public SockObj Select(ILife iLife)
        {
            while (iLife.IsLife()){
                if (sockQueue.Count > 0){

                    IAsyncResult ar = sockQueue.Dequeue();

                    if (ProtocolKind == ProtocolKind.Udp){

                        SockUdp sockUdp = null;
                        var ep = (EndPoint)new IPEndPoint(IPAddress.Any, 0);
                        try{
                            int len = _socket.EndReceiveFrom(ar, ref ep);
                            sockUdp = new SockUdp(Kernel,_socket, _udpBuf, len, (IPEndPoint) ep); //ACCEPT

                        } catch (Exception){
                            sockUdp = null;
                        }
                        //受信開始
                        BeginReceive();
                        return sockUdp;
                    } else {
                        //自分自身を複製するため、いったん別のSocketで受け取る必要がある
                        var newSocket = _socket.EndAccept(ar); //ACCEPT

                        //受信開始
                        BeginReceive();

                        //Ver5.9.2 Java fix
                        //return new SockTcp(Kernel, newSocket);
                        return new SockTcp(Kernel, _ssl, newSocket);
                    }
                }
                //Ver5.8.1
                //Thread.Sleep(0);
                Thread.Sleep(1);
            }
            SetError("isLife()==false");
            return null;
        }
Example #8
0
        // 共通メソッド
        // リクエスト送信して、サーバから返ったデータをDNSパケットとしてデコードする
        // レスポンスが無い場合は、1秒でタイムアウトしてnullを返す
        // rd = 再帰要求
        private PacketDns lookup(DnsType dnsType, string name,bool rd=false)
        {
            //乱数で識別子生成
            var id = (ushort) (new Random()).Next(100);
            //送信パケット生成
            var sp = new PacketDns(id, false, false, rd, false);
            //質問フィールド追加
            sp.AddRr(RrKind.QD, new RrQuery(name, dnsType));
            //クライアントソケット生成、及び送信
            var cl = new SockUdp(new Kernel(), new Ip(IpKind.V4Localhost), 53, null, sp.GetBytes());
            //受信
            //byte[] recvBuf = cl.Recv(1000);
            var recvBuf = cl.Recv(3);

            if (recvBuf.Length == 0){
                //受信データが無い場合
                return null;
            }
            //System.out.println(string.Format("lookup(%s,\"%s\") recv().Length=%d", dnsType, name, recvBuf.Length));
            //デコード
            var p = new PacketDns(recvBuf);
            //System.out.println(print(p));
            return p;
        }
Example #9
0
        //addrは通常オーダで指定されている
        //private PacketDns Lookup(Ip ip, string requestName, DNS_TYPE dnsType,RemoteInfo remoteInfo) {
        private PacketDns Lookup(Ip ip, string requestName, DnsType dnsType, Ip remoteAddr)
        {
            //Ip ip = new Ip(addr);
            Logger.Set(LogKind.Detail, null, 17, string.Format("{0} Server={1} Type={2}", requestName, ip, dnsType));
            //"Lookup"

            //受信タイムアウト
            const int timeout = 3;

            //		var random = new Random(Environment.TickCount);
            //		var id = (ushort) random.Next(0xFFFF);//識別子をランダムに決定する
            var random = new Random();
            var id = (ushort) random.Next(0xFFFF);
            const bool qr = false; //要求
            const bool aa = false; //権威なし
            var rd = (bool) Conf.Get("useRD"); //再帰要求を使用するかどうか
            const bool ra = false; //再帰無効

            //リクエストパケットの生成
            var sp = new PacketDns(id, qr, aa, rd, ra);

            AppendRr(sp, RrKind.QD, new RrQuery(requestName, dnsType)); //QR(質問)フィールド追加

            const int port = 53;
            //SockUdp sockUdp = new UdpObj(Kernel, getLogger(), ip, port);
            byte[] sendBuf = sp.GetBytes();
            var sockUdp = new SockUdp(_kernel, ip, port, null, sendBuf); //送信

            //この辺のロジックを動作確認する必要がある
            byte[] recvBuf = sockUdp.Recv(timeout);

            if (recvBuf != null && 12 <= recvBuf.Length) {
                //受信

                try {
                    var rp = new PacketDns(recvBuf);

                    var str = string.Format("{0} count[{1},{2},{3},{4}] rcode={5} AA={6}", requestName,
                        rp.GetCount(RrKind.QD), rp.GetCount(RrKind.AN), rp.GetCount(RrKind.NS), rp.GetCount(RrKind.AR),
                        rp.GetRcode(), rp.GetAa());
                    Logger.Set(LogKind.Detail, sockUdp, 18, str); //"Lookup"

                    //質問フィールの以外のリソースデータをキャッシュする
                    //for (int rr = 1; rr < 4; rr++) {
                    foreach (RrKind rr in Enum.GetValues(typeof (RrKind))) {
                        if (rr == RrKind.QD) {
                            continue; //質問フィールの以外のリソースデータをキャッシュする
                        }
                        var m = rp.GetCount(rr);
                        for (var n = 0; n < m; n++) {
                            var oneRr = rp.GetRr(rr, n);
                            _rootCache.Add(oneRr);
                            Logger.Set(LogKind.Detail, sockUdp, 24,
                                string.Format("{0} _rootCache.Count={1}", oneRr, _rootCache.Count)); //_rootCache.Add
                        }
                    }
                    return rp;
                }
                catch (IOException) {
                    //ここでのエラーログも必要?
                    return null;
                }
            }

            Logger.Set(LogKind.Error, sockUdp, 5,
                string.Format("addr={0} requestName={1} dnsType={2}", remoteAddr, requestName, dnsType));
            //Lookup() パケット受信でタイムアウトが発生しました。
            return null;
        }
Example #10
0
        //接続単位の処理
        protected override void OnSubThread(SockObj sockObj)
        {
            var sockUdp = (SockUdp)sockObj;

            //作業フォルダの確認
            if (_workDir == "") {
                Logger.Set(LogKind.Error,null,5,"");
                goto end;
            }
            if (!Directory.Exists(_workDir)) {
                Logger.Set(LogKind.Error,null,6,string.Format("workDir = {0}",_workDir));
                goto end;
            }

            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

            var offset = 0;
            var opCode = Opcode.Unknown;
            var fileName = "";
            var tftpMode = TftpMode.Netascii;

            if (!GetOpCode(sockUdp,ref opCode,ref offset))//オペコードの取得
                goto end;

            if (opCode != Opcode.Wrq && opCode != Opcode.Rrq) {
                //クライアントからのリクエストでWRQ及びRRQ以外はエラーとして受け付けない
                goto end;
            }

            if (!GetFileName(sockUdp,ref fileName,ref offset))//ファイル名の取得
                goto end;
            if (!GetMode(sockUdp,ref tftpMode,ref offset))//モードの取得
                goto end;
            var path = string.Format("{0}\\{1}",_workDir,fileName);

            //リクエスト元に対するソケットを新規に作成する
            var ip = sockUdp.RemoteIp;
            var port = sockUdp.RemoteAddress.Port;
            var childObj = new SockUdp(Kernel,ip,port,null,new byte[0]);

            if (opCode == Opcode.Wrq) {//アップロード処理

                if (!UpLoad(childObj,path)) {
                    //エラー
                }

            } else if (opCode == Opcode.Rrq) {//ダウンロード処理

                if (!DownLoad(childObj, path)){
                    goto end;
                }
            }
            end:
            if (sockUdp != null)
                sockUdp.Close();
        }
Example #11
0
        //アップロード(ファイル受信)
        bool UpLoad(SockUdp childObj,string path)
        {
            var ret = false;

            ushort no = 0;
            var totalSize = 0;
            FileStream fs = null;
            BinaryWriter bw = null;

            if (!(bool)Conf.Get("write")) {//「書込み」が許可されていない
                Logger.Set(LogKind.Secure,childObj,11,path);
                //エラーコード(2) アクセス違反
                childObj.Send(Bytes.Create(Util.htons((ushort)Opcode.Error),Util.htons(2),"Transmission of a message prohibition"));
                goto end;
            }
            if (!(bool)Conf.Get("override")) {//「上書き」が許可されていない
                if (File.Exists(path)) {
                    Logger.Set(LogKind.Secure,childObj,12,path);
                    //エラーコード(6) アクセス違反
                    childObj.Send(Bytes.Create(Util.htons((ushort)Opcode.Error),Util.htons(6),"There is already a file"));
                    goto end;
                }
            }

            //ACK(0)送信
            childObj.Send(Bytes.Create(Util.htons((ushort)Opcode.Ack),Util.htons(no)));

            try {
                fs = new FileStream(path,FileMode.OpenOrCreate,FileAccess.Write);
            } catch (Exception e) {
                //エラーコード(2) アクセス違反
                childObj.Send(Bytes.Create(Util.htons((ushort)Opcode.Error),Util.htons(2),e.Message));
                goto end;
            }

            bw = new BinaryWriter(fs);

            while (true) {
                //受信
            //                if (!childObj.Recv(Timeout)) {
                var buf = childObj.Recv(Timeout);
                if (buf.Length==0) {
                    Logger.Set(LogKind.Error,childObj,7,string.Format("{0}sec",Timeout));
                    break;
                }
                if ((Opcode)(buf[1]) != Opcode.Data) {
                    break;
                }

                //次のデータかどうかの確認
                if (Util.htons(BitConverter.ToUInt16(buf,2)) != no + 1)
                    continue;
                no++;

                int size = buf.Length - 4;
                bw.Write(buf,4,size); //Write
                totalSize += size;

                //ACK送信
                childObj.Send(Bytes.Create(Util.htons((ushort)Opcode.Ack),Util.htons(no)));

                if (size != 512) {
                    Logger.Set(LogKind.Normal,childObj,8,string.Format("{0} {1}byte",path,totalSize));
                    ret = true;
                    goto end;
                }
                Thread.Sleep(1);
            }
            end:
            if(bw!=null)
                bw.Close();
            if(fs!=null)
                fs.Close();
            return ret;
        }
Example #12
0
 //オペコードの取得
 bool GetOpCode(SockUdp sockUdp,ref Opcode opCode,ref int offset)
 {
     //オペコードの取得
     byte n = 0;
     try {
         n = sockUdp.RecvBuf[1];
         opCode = (Opcode)n;
     } catch {
         opCode = Opcode.Unknown;
     }
     if (opCode < Opcode.Rrq || Opcode.Oack < opCode) {
         Logger.Set(LogKind.Error,sockUdp,1,string.Format("OPCODE=0x{0:x}",n));
         return false;
     }
     offset += 2;
     return true;
 }
Example #13
0
 //モードの取得
 bool GetMode(SockUdp sockUdp,ref TftpMode tftpMode,ref int offset)
 {
     string modeStr = GetString(sockUdp.RecvBuf,offset);
     if (modeStr == null) {
         Logger.Set(LogKind.Error,sockUdp,3,"mode=null");
         return false;
     }
     if (modeStr.ToLower() == "netascii") {
         tftpMode = TftpMode.Netascii;
     } else if (modeStr.ToLower() == "octet") {
         tftpMode = TftpMode.Octet;
     } else {
         Logger.Set(LogKind.Error,sockUdp,4,string.Format("mode={0}",modeStr));
         return false;
     }
     offset += modeStr.Length + 1;
     return true;
 }
Example #14
0
 //ファイル名の取得
 bool GetFileName(SockUdp sockUdp,ref string fileName,ref int offset)
 {
     fileName = GetString(sockUdp.RecvBuf,offset);
     if (fileName == null) {
         Logger.Set(LogKind.Error,sockUdp,2,"fileName=null");
         return false;
     }
     offset += fileName.Length + 1;
     return true;
 }
Example #15
0
        //ダウンロード(ファイル送信)
        bool DownLoad(SockUdp childObj,string path)
        {
            var ret = false;
            var no = (ushort)1;
            var total = 0;
            FileStream fs = null;
            BinaryReader br = null;

            if (!(bool)Conf.Get("read")) {//「読込み」が許可されていない
                Logger.Set(LogKind.Secure,childObj,10,path);
                //エラーコード(2) アクセス違反
                childObj.Send(Bytes.Create(Util.htons((ushort)Opcode.Error),Util.htons(2),"Receive of a message prohibition"));
                goto end;
            }

            if (!File.Exists(path)) {//ファイルが見つからない
                Logger.Set(LogKind.Secure,childObj,13,path);
                //エラーコード(1) ファイルが見つからない
                childObj.Send(Bytes.Create(Util.htons((ushort)Opcode.Error),Util.htons(1),"A file is not found"));
                goto end;
            }

            try {
                fs = new FileStream(path,FileMode.OpenOrCreate,FileAccess.Read);
            } catch (Exception e) {
                //エラーコード(2) アクセス違反
                childObj.Send(Bytes.Create(Util.htons((ushort)Opcode.Error),Util.htons(2),e.Message));
                goto end;
            }

            br = new BinaryReader(fs);

            while (true) {
                var data = br.ReadBytes(512);

                //DATA 送信
                childObj.Send(Bytes.Create(Util.htons((ushort)Opcode.Data),Util.htons(no),data));
                total += data.Length;

                if (data.Length < 512) {
                    if (data.Length == 0) {
                        //最後の 0bytes データを送る
                        childObj.Send(Bytes.Create(Util.htons((ushort)Opcode.Data),Util.htons(no)));
                    }
                    Logger.Set(LogKind.Normal,childObj,9,string.Format("{0} {1}byte",path,total));
                    ret = true;
                    goto end;
                }

                Thread.Sleep(10);

                // ACK待ち
                //if (!childObj.Recv(Timeout)) {
                var buf = childObj.Recv(Timeout);
                if (buf.Length==0) {
                    Logger.Set(LogKind.Error,childObj,7,string.Format("{0}sec",Timeout));
                    break;
                }
                if ((Opcode)(buf[1]) != Opcode.Ack)
                    break;
                //ACK番号が整合しているかどうかの確認
                var ackNo = Util.htons(BitConverter.ToUInt16(buf,2));
                if (no != ackNo) {
                    Logger.Set(LogKind.Error,childObj,14,string.Format("no={0} ack={1}",no,ackNo));
                    //エラーとして処理する
                    childObj.Send(Bytes.Create(Util.htons((ushort)Opcode.Error),Util.htons(2),"unmatch ACK"));
                    goto end;
                }
                no++;//次のデータ
            }
            end:
            if (br != null)
                br.Close();
            if (fs != null)
                fs.Close();
            return ret;
        }
Example #16
0
        void UdpTunnel(SockUdp udpObj)
        {
            //int timeout = this.OpBase.ValInt("timeOut");
            var sock = new Dictionary<CS, SockUdp>(2);
            sock[CS.Client] = udpObj;
            sock[CS.Server] = null;

            //***************************************************************
            // �T�[�o�Ƃ̐ڑ�
            //***************************************************************
            {
                int port = _targetPort;
                //var ip = new Ip(_targetServer);
                //if (ip.ToString() == "0.0.0.0") {
                //    try {
                //        var iphe = Dns.GetHostEntry(_targetServer);
                //        if (iphe.AddressList.Length == 0) {
                //            goto end;
                //        }
                //        ip = new Ip(iphe.AddressList[0].ToString());
                //    } catch {//���O�Ɏ��s�����ꍇ
                //        Logger.Set(LogKind.Normal,null, 4, string.Format("{0}:{1}", _targetServer, _targetPort));
                //        goto end;
                //    }
                //}
                Ip ip;
                try{
                    ip = new Ip(_targetServer);
                }catch(ValidObjException){
                    try {
                        var iphe = Dns.GetHostEntry(_targetServer);
                        if (iphe.AddressList.Length == 0) {
                            goto end;
                        }
                        ip = new Ip(iphe.AddressList[0].ToString());
                    } catch {//���O�Ɏ��s�����ꍇ
                        Logger.Set(LogKind.Normal, null, 4, string.Format("{0}:{1}", _targetServer, _targetPort));
                        goto end;
                    }
                }

                sock[CS.Server] = new SockUdp(Kernel,ip, port, null,new byte[0]);
                if(sock[CS.Server].SockState == Bjd.sock.SockState.Error)
                    goto end;
            }
            sock[CS.Server].Send(sock[CS.Client].RecvBuf);//�T�[�o�֑��M
            //if (sock[CS.Server].Recv(Timeout)) {//�T�[�o����̎�M
            var buf = sock[CS.Server].Recv(Timeout);
            if(buf.Length==0){
                sock[CS.Client].Send(buf);//�N���C�A���g�֑��M
            }
            Logger.Set(LogKind.Normal,sock[CS.Server],7,string.Format("UDP {0}:{1} - {2}:{3} {4}byte",sock[CS.Client].RemoteHostname,sock[CS.Client].RemoteAddress.Port,_targetServer,_targetPort,buf.Length));

            end:
            //udpObj.Close();UDP�\�P�b�g(udpObj)�̓N���[���Ȃ̂ŃN���[�Y���Ă�A��������Ȃ���Close()��Ăяo���Ă���͂Ȃ�
            if (sock[CS.Client] != null)
                sock[CS.Client].Close();
            if (sock[CS.Server] != null)
                sock[CS.Server].Close();
        }