コード例 #1
0
        public override PDU AETitle(PDU pdu)
        {
            AETsBtoS(pdu);

            if (uced == pced && ucing == pcing)
            {
                /*构造回复AC
                 * 1实例化新的AC类(保存配置信息)
                 * 2调用AC write,传入相应参数ACpdu,返回ACpdu
                 * 3调用AC.r
                 *
                 */
                AAssociateAC ACpdu = new AAssociateAC();

                ACpdu.uCalledAET  = pdu.uCalledAET;
                ACpdu.uCallingAET = pdu.uCallingAET;
                ACpdu.VItems      = pdu.VItems;
                ACpdu             = ACpdu.writeAC(ACpdu);
                pdu.r             = ACpdu.r;

                pdu.log = "DICOMSCU << A - ASSOCIATE - AC PDU" + "\r\n";
            }
            else if (uced != pced)
            {
                pdu.r   = HexStringToByteArray("03 00 0000000A 00 02 03 07");
                pdu.log = "DICOMSCU << A - ASSOCIATE - RJ PDU" + "\r\n";
            }
            else if (ucing != pcing)
            {
                pdu.r   = HexStringToByteArray("03 00 0000000A 00 02 03 03");
                pdu.log = "DICOMSCU << A - ASSOCIATE - RJ PDU" + "\r\n";
            }
            return(pdu);
        }
コード例 #2
0
 //AETs字节数组转字符串
 public void AETsBtoS(PDU pdu)
 {
     uced  = Encoding.Default.GetString(pdu.uCalledAET).TrimEnd();
     ucing = Encoding.Default.GetString(pdu.uCallingAET).TrimEnd();
     pced  = Encoding.Default.GetString(pdu.pCalledAET).TrimEnd();
     pcing = Encoding.Default.GetString(pdu.pCallingAET).TrimEnd();
 }
コード例 #3
0
        //编码pdu为string
        public string PDUString(PDU pdu)
        {
            string t = BitConverter.ToString(pdu.PDUType);//byte数组转为16进制string
            string pdus;

            AETsBtoS(pdu);

            if (t == "01" || t == "02")
            {
                ContextDataSet cd = new ContextDataSet(pdu);
                cd.AppItem();
                cd.PreItem(pdu.PDUType.ToString() == "02");
                cd.UInfoItem();
                pdu.context = cd.decodeContxt();
                pdus        = "\nPDUType:" + t + "\tPDULength:" + pdu.PDULength.ToString("x2") + "\tVersion:" + BitConverter.ToString(ProtocalVersion) + "\nCalledTitle:" + uced + "\nCallingTitle:" + ucing + "\nContext:\n" + pdu.context;
            }
            else
            {
                pdus = "\nPDUType:" + t + "\tPDULength:" + pdu.PDULength.ToString("x2") + "\tResult:" + pdu.Result.ToString("x2") + "\tSource:" + pdu.Source.ToString("x2") + "\tReason:" + pdu.Reason.ToString("x2");
            }
            pdus = pdus.Replace("-", "");
            return(pdus);
        }
コード例 #4
0
ファイル: Form1.cs プロジェクト: ZhangKe-Zoe/DICOMSCP
        //处理接收的客户端数据
        public void ReceiveFromClient()
        {
            /*
             * 1 循环读取:先读取一位,判断类型,使用不同方法解码(RQ/AC 和 RJ/RL)
             * 2 安位循环读取,大于PDUlength或AET时break
             * 3 根据不同类型构造并返回结果
             * 4 循环接收客户端pdu
             */

            while (true)
            {
                try
                {
                    PDU pdu = null; //实例化相应PDU解析类,存储解析并pdu内容
                    f = true;       //循环读取第一位标志

                    //循环读第一位,判断类型,符合类型跳出循环,解析剩余内容
                    while (f)
                    {
                        try
                        {
                            t    = br.ReadByte();
                            type = t.ToString("x2");
                            switch (type)
                            {
                            case "01": { f = false; pdu = new AAssociateRQ(); break; }  //修改标志,跳出循环

                            case "02": { f = false; pdu = new AAssociateAC(); break; }  //修改标志,跳出循环

                            case "03": { f = false; pdu = new AAssociateRJ(); break; }  //修改标志,跳出循环

                            case "05": { f = false; pdu = new AReleaseRQ(); break; }    //修改标志,跳出循环

                            case "06": { f = false; pdu = new AReleaseRP(); break; }    //修改标志,跳出循环

                            default: break;
                            }
                        }
                        catch { break; }
                    }

                    //保存pdu类型,并打印
                    pdu.PDUType[0] = t;
                    rtbLog.AppendText(pdu.Log());

                    //读取PDU长度
                    br.ReadByte();              //跳过保留位
                    uint length = 0;
                    for (int i = 0; i < 4; i++) //长度占4位
                    {
                        length *= 256;          //左移8位
                        length += br.ReadByte();
                    }
                    pdu.PDULength = length;

                    //读取剩余PDU内容
                    byte[] pdu1 = br.ReadBytes((int)length);

                    //分解剩余头部
                    pdu.PDUSplit(pdu1);
                    rtbLog.AppendText("\nRecieved RQ PDU:" + pdu.PDUString(pdu) + "\n\n");


                    //比较AET
                    pdu.pCalledAET  = CalledTitle;
                    pdu.pCallingAET = CallingTitle;
                    pdu.AETitle(pdu);


                    //发送结果
                    rtbLog.AppendText("\nSent PDU:\n");
                    foreach (byte i1 in pdu.r)
                    {
                        rtbLog.AppendText(i1.ToString("x2"));
                    }

                    rtbLog.AppendText("\n\n" + pdu.log);

                    bw.Write(pdu.r);
                    bw.Flush();

                    //释放关联,关闭网络流,修改网络流状态标志,跳出循环
                    if (type == "05")
                    {
                        br.Close(); bw.Close(); nets = false; break;
                    }

                    //重置循环解析type标志
                    f = true;
                }
                catch { break; }
            }
        }
コード例 #5
0
 public override PDU AETitle(PDU pdu1)
 {
     return(pdu1);
 }
コード例 #6
0
 //比较AETitle
 public abstract PDU AETitle(PDU pdu1);
コード例 #7
0
 public override PDU AETitle(PDU pdu1)
 {
     r   = HexStringToByteArray("06 00 0000000A 00 00 00 00");
     log = "DICOMSCU >> A - RELEASE - RP PDU" + "\r\n";
     return(pdu1);
 }
コード例 #8
0
 public override PDU AETitle(PDU pdu1)
 {
     throw new NotImplementedException();
 }
コード例 #9
0
 public ContextDataSet(PDU pdu)
 {
     this.pdu   = pdu;
     pdu.VItems = new List <Item>();
 }