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); }
//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(); }
//编码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); }
//处理接收的客户端数据 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; } } }
public override PDU AETitle(PDU pdu1) { return(pdu1); }
//比较AETitle public abstract PDU AETitle(PDU pdu1);
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); }
public override PDU AETitle(PDU pdu1) { throw new NotImplementedException(); }
public ContextDataSet(PDU pdu) { this.pdu = pdu; pdu.VItems = new List <Item>(); }