exe源码剖析,0网络通讯协议

转载:http://blog.csdn.net/zssureqh/article/details/39237649

转载:http://blog.csdn.net/zssureqh/article/details/39213817

转载:http://blog.csdn.net/zssureqh/article/details/41016091

背景:

       
上壹篇博文中,在对storescp工具源文件storescp.cc和DcmSCP类的源文件scp.cc实行分析后,得出了两岸都得以兑现响应C-ECHO和C-STORE(要求对DcmSCP类举行扩大)请求的效用。可是在对DcmSCP类举办增加,期望模拟达成和谐的storescp.exe工具时遇见了难点,客户端指示服务中断链接,而服务端展现保存失利,如下图所示。本次博文经过消除该难题再一遍对storescp.cc和scp.cc实行对照,首要从Presentation
Context、AbstractSyntax、TransferSyntax等细节出发,认真读书DICOM通信服务。

 

澳门威尼斯人网址 1

 

背景:

       
上壹篇专栏博文中针对PACS终端(或设施终端,如CT设备)与卡宴IS系统之间worklist查询举办了介绍,并首要相比较分析了DICOM3.0中各部分对DICOM互连网通信服务的概念。此番通过结合早些日子的博文DICOM法学图像处理:基于DCMTK工具包学习和剖析worklist,对DC德州仪器开源库中提供的storescp.exe和storescu.exe工具的源码实行辨析,从最底层深刻驾驭C-STORE服务的接触及响应。

背景:

       
专栏取名称叫DICOM历史学图像处理原因是:博主是从法学图像处清理计算法商量时初始接触DICOM协议的。当初认识有局限性,感觉DICOM只是三个简易的文件格式约定,一言以蔽之,作者随即以为DICOM协议正是扩充名字为DCM文件的格式表达。其实不然,随着对医疗行当的心心念念,对DICOM协议也有了更全面包车型客车认识。方今才发觉DCM文件只是DICOM协议一部分中的一小节,仅仅是一切协议中的贰个数据结构,而DICOM协议越来越多的是有关医疗行当种种劳动及连锁流程的预订,因而实际DICOM协议中最根本的是音讯流,是对医院全部运行流程的预约。依笔者看来,能够将DICOM分为两大类(那里只是从DICOM相关从业者平日工作角度出发来分类的):一)DICOM经济学图像处理,即DCM文件中现实数指标拍卖,说图像大概有点狭隘,广义上还包涵波形(心电)、录像(超声)等等;二)DICOM互联网传输,首要讲述音信在卫生院各系统里面包车型大巴交互方式及传输格式。像自身事先的研讨就完全属于第二类“DICOM文学图像处理”,一旦解析出DICOM的文件格式其实与符合规律的图像处理就从不异样。若是仅此而已,能够说跟医疗就从未任何关联,与诊治行业重组紧凑的是第3类“DICOM互联网传输”,该部分是普通病者到医院就医等全体流程的空洞,是DICOM标准的着力。因而这次博文就注重介绍“DICOM网络传输”中的第3环节:网络连接(Association,在OSI中称之为Connection),并结合DC高通和fo-dicom的源码实行实例介绍。

标题消除:

解析思路:

       
storescp.exe和storescu.exe分别出任着C-STORE服务的SCP和SCU,因而疑忌七个工具包一定是使用了DCMediaTek提供的DcmSCP和DcmSCU类来分别达成的。为了注解本人的想法,从分析storescp.exe源码文件storescp.cc出手,相比storescp.cc与scp.cc,寻找两岸的共同点。借使与大家的设想1致,就新建几个C++本地下工作程,利用DcmSCP类来建立友好的C-STORE
SCP端,期望达到与storescp.exe工具包同样的效果。

DICOM网络传输:

1)比较分析storescp.exe工具包与自定义务工作具包的调节和测试新闻

       
为了撤废storescu.exe客户端的标题,大概明确难点应运而生的限定,决定再一遍用storescp.exe作为客户端,使用storescu.exe对其发送C-STORE请求,查看storescu.exe客户端的调节和测试音讯。与大家的自定义务工作具服务端的调试音信举办对照。

澳门威尼斯人网址 2

        比较上海体育场地中的调节和测试新闻,个中革命部分END
A-ASSOCIATE-AC代表的是服务端已经胜利的与客户端达成了拉手,即互连网已经顺遂响应了客户端的连天。暗黑部分表示客户端发送的C-STORE-奥德赛Q请求也一度顺遂的达到了服务端,唯一区别的就是铬黄圆圈标识的片段,表明在服务端接收到C-STORE-途锐Q请求后对其处理极度。而大家和好包裹的ZSDcmStoreSCP类对于C-STORE-智跑Q的处理函数是一贯拷贝的storescp.exe工具内的storeSCP和storeSCPCallback函数。因而大概能够规定难题或然出现的限制。

storescp.cc与scp.cc源码分析:

服务端(Server,SCP)/客户端(Client,SCU):

       
DICOM选取C/S格局来叙述网络传输:客户端(Client)连接到服务端(Server)然后利用服务端提供的各类服务(Services)。不一致于传统互联网连接中的Server和Client的,DICOM中的Server叫做ServiceClass Provider,Client叫做Service Class
User。想要建立DICOM连接(Association,守旧OSI模型中称之为Connection),客户端会向服务端发送连接请求新闻,该音信根本描述客户端此番连接所期望的DICOM服务及有关安装;随后服务端会查看客户端发送过来的请求新闻,确认本身是否援救客户端请求的相干服务并交付反馈音信(DICOM中称之为响应音信Response
Message)。响应新闻主要分为以下几类:一)假若服务端接济客户端请求的一点服务,服务端会发送确认消息(Association
Acknowledge),证明此番连接产生;2)不然发送拒绝音讯(Association
Reject),文告客户端(SCU)连接败北。全部与连接相关的音信在DICOM协议中的ACSE(Association
Control Service Element)定义。

       
1旦网络连接建立,客户端(SCU)和服务端(SCP)就足以拓展音信交互。DICOM标准中的DIMSE(DICOM
Message ServiceElement)将此类新闻分为1一类(详细情况可参见DICOM协议中的相关细节,也可参见作者事先的博文http://blog.csdn.net/zssureqh/article/details/39098621)。依照与连接消息(ACSE)的两样,提供的DIMSE新闻种类也差异。例如守旧一幅DICOM图像到服务端举行归档,使用的是C-STORE
DIMSE音信;假使愿意经过病者姓名和病者出生日期来询问病者的档案,需求选用DIMSE
C-FIND新闻。

澳门威尼斯人网址 3

澳门威尼斯人网址 4

2)单步调节和测试

       
在handleIncomingCommand函数内部调用storeSCP指令处插入断点,进入单步调节和测试意况。利用VS2013提供的新的调整工具“并行货仓”,找到了第一个重返状态cond.bad()为true的地点,即函数ASC_findAcceptedPresentationContext,如下图所示:

 

澳门威尼斯人网址 5

 

       
继续单步调节和测试,进入到ASC_findAcceptedPresentationContext函数内部,发现确实出现谬误的地方是findPresentationContextID,该函数的参数presentationContextID始终为零。

澳门威尼斯人网址 6

猜测:大概是presentationContextID参数在传递进程中的某1环节出错了,导致程序退步。为了验证我们的想法,展开storescp.exe工程,进入调节和测试形式,查看参数的数值情状,如下图所示,storescp.exe工具包中presentationContextID参数的值为四一。由此注解了大家在presentationContextID参数字传送递的进度中发出了错误。

 

澳门威尼斯人网址 7

 

一)storescp.cc源码分析

       
storescp.cc是DCMTK提供的storescp.exe工具的源文件。间接张开storescp.cc文件,首先可以看出作者给出的表明:

 

澳门威尼斯人网址 8

 

       
Purpose回顾了该工具的首要用途——是储存服务的提供者,用来响应C-STORE
操作。由于storescp.exe是一个命令行工具,即用户能够经过分裂的参数设置或组合来贯彻区别的功用。因而在storescp.cc文件初步main主函数外部定义了重重大局的命令行参数变量,例如大家上壹篇博文DICOM文学图像处理:周密剖析DICOM三.0规范中的通信服务模块中选拔的storescp.exe
-d 10肆 -aet OFFIS命令行中的拾四相呼应的参数是opt_port,
从参数opt_前缀亦能够猜出用途。

       
由于storescp.exe工具是急需与客户端进行互动的,接下去进入到main主函数后的首先件业务便是初始化互联网环境。一般来讲图所示,小编运用标准编写翻译(如下图中的红圈所示)以来完结分裂种类的互联网环境的伊始化,由于本人使用的是Windows七操作系统,由此原则编写翻译的结果是调用WSAStartup早先化Windows
套接字(Socket)的互联网环境。

 

澳门威尼斯人网址 9

 

       
互联网环境的伊始化是main函数的第二步操作,随后正是前边提到的命令行参数的剖析,因为storescpp.exe是命令行类型的工具包。从文件260行至9九二行就是命令行参数的解析部分,大家一时半刻直接跳过该部分,轻巧地感觉该有的完毕的效果就是对应参数的赋值。

接下去正式进入到了DICOM模块,

率先步,加载DICOM字典文件。该手续大概是具备与DICOM操作相关的文本的率先步。其实就是加载八个先期写好的隐含各样DICOM三.0专业中规定的字段的文件文件。

其次步,早先化互连网连接,创造网络连接的1个实例,格式为T_ASC_Network(如下图),记住该类型,不要与背后现身的T_ASC_Association混淆了。其实在率先步和第三步之间大家差不多了壹部分代码,该片段重大是用来支配storescp.exe工具的运营机制,是单线程依然二10十二线程。

 

澳门威尼斯人网址 10

 

其三步,进入外层while循环。在运用ASC_initializeNetwork早先化网络环境后,就进来到了while循环内的acceptAssociation函数。这也是正规境况下,while循环中绝无仅有的办事函数。随后正是待连接断开后的收尾职业。

第陆步,单步调节和测试进入acceptAssociation函数内部。从函数后面包车型客车注释领悟到函数是用来选用处理链接请求的,注意看函数的参数,传递进入的是上边大家发轫化后赚取的互连网连接变量net,ascfig是由此解析命令行而获得的布局参数。

 

澳门威尼斯人网址 11

 

第4步,函数acceptAssociation内部初步通过调用ASC_receiveAssociation来品尝获得客户端的连天请求,该函数与socket编制程序中的accept函数类似,能够设置阻塞方式和非阻塞情势(关于套接字的隔离形式和非阻塞格局的界别可参见《Windows互连网编制程序》)。调用该函数后storescp.exe工具就暂停,等待客户端发起链接。

 

澳门威尼斯人网址 12

 

第4步,当有客户端连接进入后,ASC_receiveAssociation函数重返,随后会油然则生过多以ASC_为前缀的函数,首要有ASC_acceptContextsWithPreferredTransferSyntaxes、ASC_setAPTitles、ASC_getApplicationContextName,以及一旦发生错误情状下会调用的ASC_rejectAssociation。参照博文DICOM法学图像处理:周到剖析DICOM三.0规范中的通信服务模块中的分析可见,以ASC_为前缀的函数属于DICOM三.0中的Association
Managements,首要在第7有个别执教。用来兑现上层DIMSE与下层DUL(Dicom
Upper Layer
Protocol)的调换,所处的岗位如下图(更详实的牵线可参考上一篇博文)。因此可见该部分是在ASC_receiveAssociation接收到客户端连接后,所举行的有关连接层的连锁安插。(要小心该部分的配置流程,上边包车型地铁实例讲授中会重点介绍由于该有的陈设错误,导致模拟的工具包不能符合规律运作【注壹】)。

 

澳门威尼斯人网址 13

 

第7步,接收客户端连接并安顿完毕后正是出殡和埋葬确认音讯,即调用函数ASC_澳门威尼斯人网址,acknowledgeAssociation。此处注意从ASC_receiveAssociation函数重临后,三番五次的相干ASC_函数操作的参数就从T_ASC_Network类型的net变成了T_ASC_Association类型的assoc,其象征的是客户端的连年。

 

澳门威尼斯人网址 14

 

第10步,storescp.exe发送完确认音信后,接下去就必要处理客户端发来的实际请求了。该有的工作包括在processCommands中。

第九步,进入到processCommands函数内部,就是大家所碰着的第3个里面while循环,与第二步中的while外部循环不一样的是该内部循环用来收纳客户端发来的DIMSE音讯的,而第3步中的while循环是用来循环等待客户端连接请求。

第十步,内部while循环内,调用DIMSE_前缀函数,来落到实处DIMSE层的新闻互相,那也是C-ECHO、C-STORE、C-FIND等请求具体完毕的有个别。首先调用DIMSE_receiveCommand接收客户端的DIMSE新闻,随后依照DIMSE中的CommandSet的品类,分别展开处理,如下图所示,可以看出storescp.exe工具可以对C-ECHO和C-STORE举行拍卖。

 

澳门威尼斯人网址 15

 

       
至此,通过上述大约的10步我们对storescp.exe源码有了二个较深切周详的认识。从调用的ASC_和DIMSE_函数来看,storescp.exe完全根据DICOM叁.0的网络通信协议来处理C-ECHO和C-STORE请求的。

       
依照OFFIS官方网址给出的有关dcmnet网络通信包的牵线(http://support.dcmtk.org/docs/mod_dcmnet.html),可见DCMediaTek库中提供了四个来落实DICOM网络通信两端的类DcmSCP和DcmSCU。那么storescp.exe为啥未有直接用DcmSCP来贯彻C-STORE的服务端呢?利用DcmSCP类是还是不是足以来落到实处storescp.exe工具的成效吗?

请求连接:

       
如上所述,客户端SCU向劳动端SCP发送连接请求,请求服务及连锁消息。除此以外,请求新闻中还包罗以下消息:

 

  • 请求端实体名称(Calling AE
    Title):在DICOM服务中,用于代替客户端(SCU)的暗号,就如大家的人名一样;
  • 被呼吁实体名称(Called AE
    Title):在DICOM服务中,用于取代服务端(SCP)的符号,就像大家的全名一样;
  • 讲述上下文(Presentation Contexts):是三个服务清单(List of
    瑟维斯s)。清单体积最多不超过1二十几个,用于描述客户端希望从服务端获得的各式服务,每壹项服务重大致括SOP
    Class和List of Transfer Syntaxes。

 

下边对上述三中国国投息进行更详实介绍:

 

        AE
Title:在DICOM网络中每2个DICOM系统都会被分配三个称呼,即Application
Entity Title,简称AETitle。AE
Title用于标志DICOM网络中的唯一(Unique)DICOM系统(有点类似于互联网中的IP地址),由此在三个DICOM网络环境中,要保证每3个DICOM系统具有唯一的称呼——那些工作1般由DICOM互联网管理员来产生。AE
Title最长不超过十五个字符,经常在其实使用进程中都运用大写字母来表示,当然也得以行使小写字母及其它ASCII码。在确立连接进度中,客户端SCU会发送温馨的AE
Title(即Calling AE Title)以及服务端的AE Title(即Called AE
Title,当然那一个只是客户端期望的,实际处境有希望并非如此)。

        Presentation
Contexts:DICOM协议已经有20多年的历史,从19玖三年DICOM标准建议以来,新的网络连接不断地被增添到DICOM协议中。例如199玖年引入的MWL服务,即Modality
Worklist
瑟维斯s(关于WML的讲述可参见以前的博文)。因而超过十二分之5DICOM系统只帮忙DICOM标准中的部分服务,例如PACS系统往往就不会提供WML服务。差别的DICOM服务用于分裂的指标,客户端(SCU)会向服务端(SCP)发送其希望从服务端获得的劳动,而服务端会查看其提供的种种服务是还是不是是客户端期望的来调整是还是不是提供。鉴于以上原因,客户端(SCU)会向服务端发送壹多种长度小于12八的被号称描述上下文(Presentation
Contexts)的信息列表,每叁个描述上下文代表1种客户端期望的劳动。客户端用DICOM标志符来标记每一种服务,即SOP
Class UID(Service Object Pair Class Unique
Identifier),在DICOM标准的第伍片段有详实介绍。在连年内外文中,被发送的SOP
Class 也被叫做抽象语义Abstract Syntax(一定要与Transfer
Syntaxes中的Syntaxes区分开来,此前在博文http://blog.csdn.net/zssureqh/article/details/39213817#t12的学问储备中有过简短的对待介绍。在OFFIS的WIKI中对此的讲述原作为In
the context of association negotiation, the 田野先生 where the SOP class is
sent is also called “Abstract Syntax”.),因而Abstract Syntax正是SOP
Class UID的同义词。在传输SOP Class UID(即Abstract
Syntax)的还要,会发送与该服务对应的编码格式,即Transfer
Syntaxes。以乳腺检查的X光片为例,平时乳腺X光片十分的大,须要开始展览削减。客户端在向服务端发送上下文音讯时会提须求服务端1种乳腺X光片的削减情势,例如JPEG两千,同时也会提供一种被大多图像传输服务端接受的非收缩格局。如下图所示:

 

澳门威尼斯人网址 16

 

       
该客户端SCU向服务端发送了二种上下文消息(最多不超越1二十七个),每一种上下文音信(Presentation
Context)包罗一种客户端期望的劳动以及有关的各类传输情势,例如Presentation
Context ID
第11中学描述了1种数字乳腺X光片存储服务,同时提供了三种编码格局Implicit VCR-VLittle Endian和JPEG
贰仟(无损压缩)。在客户端用奇数来标示各种上下文消息(最作者号为壹,最大为255),常常从壹号早先单调递增,一、③、伍、……。至于上下文音讯之间的相继以及其内部编码格式的逐一可轻松设定。通过上海体育场面能够看看,各类服务都必须提供Implicit
VLAND Little Endian编码格式,因为那是DICOM协议中暗中同意的传输编码格局。

叁)参数字传送递流向

       
为了鲜明具体传递进度中的错误环节,大家利用回溯的艺术,通过回看findPresentationContextID函数中presentationContextID参数的根源来规定难点出现的具体地方。

澳门威尼斯人网址 17

(注:为了方便讲图片旋转了90度,劳烦我们歪着脖子将就着看一下下吧哈)

       
从上海体育场合中得以看出T_ASC_PresentationContextID参数最终的来源是我们重载DcmSCP基类的handleIncomingCommand函数,因而与storescp.exe中的是实现比较,仔细查看该有的的代码,发现了贰个重大难点,原来我们在将storescp.exe工具中的processCommands函数内容拆解到handleIncomingCommand函数内部时,将多余的DIMSE_receiveCommand函数注释掉的还要,遗漏了解说掉T_ASC_Association局地变量,使得本来应该经过DIMSE_receiveCommand函数获取的presID变量平昔被部分变量覆盖为0——至此难题找到了。

 

澳门威尼斯人网址 18

 

       
那么由于注释掉了剩下的DIMSE_receiveCommand函数,大家从哪里来博取presID参数呢。查看一下handleIncomingCommand函数的头发现函数参数中也未曾出现T_ASC_PresentationContextID类型的参数。可是比较scp.cc原本处理C-ECHO请求的函数handleECHORequest大家发现,scp.cc类中校presID的值存款和储蓄在了DcmPresentationContextInfo类型的presInfo变量中。由此大家修改storeSCP的调用,将presInfo.presentationContextID传递进入作为presID的初值。

 

澳门威尼斯人网址 19

 

       
修改造成后,再一次调节和测试发现程序运转寻常,客户端顺遂收到了服务端反馈回来的DIMSE
Message,并且在服务端的目录下也来看了storescu.exe传递过来的dcm文件(当然在storeSCP函数内部依据时间等音信对文件进行了重命名)。

澳门威尼斯人网址 20

从那之后上1博文中自模拟storescp.exe工具包的主题材料早已胜利化解,利用大家友好包裹的ZSDcmStoreSCP类能够大概地落到实处storescp.exe工具包的机能。

二)scp.cc源码分析:

       
参照OFFIS论坛中的1篇帖子(http://forum.dcmtk.org/viewtopic.php?f=1&t=4041&hilit=addPresentationContext&sid=d4de67ef5faada44233de627a062d3b7)中对DcmSCP的差不多使用,来具体分析一下DcmSCP类的源码文件scp.cc。

率先步,DcmSCP的构造函数。如下图,在构造函数内部,完毕了对互连网环境的起初化,那与storescp.exe的main函数伊始的代码是一律的。

 

澳门威尼斯人网址 21

 

其次步,依照OFFIS官方网站提供的类表明文件,在DcmSCP开放的函数中listen用于落到实处对客户端请求的拍卖。其他的公共函数从名称上就足以阅览大多是安插和获得相关参数的函数,不是以set为前缀就是get,所以接下去重点分析listen函数内部的完结。

 

澳门威尼斯人网址 22

 

其三步,进入到listen函数内部。发现listen函数起先部分是用来加载DICOM字典文件的,与storescp.cc文件中DICOM部分的第三步同样。接下来正是有关的劳动开启格局(单线程or二十多线程,阻塞or非阻塞)。

第6步,随后出现了ASC_initializeNetwork函数,用来伊始化互联网连接。

第六步,进入到第3个while循环,循环之中调用的是waitForAssociation函数,用来等待客户端的其实连接请求,注意此时的参数也是T_ASC_Network类型的m_net,那一点与storescp.exe情形1模同样。

 

澳门威尼斯人网址 23

 

第五步,进入到waitForAssociation函数内部,出现的是ASC_receiveAssociation函数,那与storescp.exe源码分析中的第六步一样。随后出现的也是以ASC_为前缀的过多函数,用来配置网络连接的切实参数。

第十步,参数配置完毕后,就是发送响应给客户端,即调用ASC_acknowledgeAssociation函数——与storescp.exe源码分析的第七步同样。

第十步,随后scp.cc内部将处理客户端指令的操作封装在了handleAssociation函数内部,须求注意的是此处handleAssociation函数并不必要传递任何参数进去因为T_ASC_Association类型的变量assoc是保留在DcmSCP内部的个体成员变量——那一点与storescp.exe直接将assoc变量传递给processCommands函数不一致【注贰】

 

澳门威尼斯人网址 24

 

第八步,handleAssociation函数内部须求处理的正是DIMSE层面包车型地铁授命交互工作。由此为了完整接收客户端的DIMSE指令,同样出现了第一个while循环,循环之中调用了DIMSE_receiveCommand指令——那与storescp.exe中的processCommands函数内部同样。

 

澳门威尼斯人网址 25

 

第八步,最终进入到了handleIncomingCommand函数内部,依据DIMSE中的CommandSet类型来分别展开C-ECHO和C-STORE的拍卖。

 

澳门威尼斯人网址 26

 

       
至此,DcmSCP的原来的文章件scp.cc分析达成了。通过与storescp.exe的源文件storescp.cc比较发现,两者基本是一致的流水生产线,无非3个是用类来开始展览了打包,另三个是落实了命令行工具。

接受(拒绝)连接:

        服务端SCP会至少接受一种上下文音讯(Presentation
Context)以及其它SCU请求的参数(例如AE
Titles)。随后服务端向客户端发送连接响应新闻接受该链接请求。链接音信响应有三种状态:

  • 接受
  • 拒绝(短暂的)
  • 拒绝(永久的)

        连接响应音讯会一直拷贝连接请求新闻中的服务端AE Title(即Called
AE Title)和客户端AE Title(即Calling AE
Title)并重回。其余还会回到响应AE Title(即Respponding AE Title),该AE
Title与服务端AE
Title一样(那是OSI协议中供给的,可是与DICOM协议差异的是,OSI合计中并大可不必双方如出一辙)。

       
当消息响应结果为接受时(即Accepted),服务端SCP会对客户端SCU请求的依次上下文音讯(Presentation
Context)举办确认,是经受也许决绝,如下图所示,DICOM标准第7局地的附录D中提交了一个示意图,作为服务触发端的DICOM-Service-User,给出了各样描述上下文,ID为一、三、五、七、九;可是在SCP端只扶助个中的二种(ID为一、3、九),并且对于各样AbstractSyntax服务端只支持个中的1种TransferSyntax。
 

 

澳门威尼斯人网址 27

        如上海体育场面所示,假设SCU请求的Presentation
Context被驳回,SCP不会越加发送任何消息;假设接受了有些Presentation
Context,SCP会选用在那之中的三个传输语义加多到再次回到音讯对应的Presentation
Context中以通告SCU。借使未有Presentation
Context被接受,那么会发送拒绝音讯,此时结果代码为Rejected。当连接建立完结后,开首准备传输数据体。

       
要是结果状态码为”Rejected(permanent)“申明服务端SCP文告客户端SCU它的呼吁被拒绝了,后续也会被拒绝。现身这种情状的来头日常由二种,壹种是伸手的AE
Title并不存在,也正是说网络中并不设有该实体;另一种是劳动端SCP不援救客户端SCU请求的其余地劳工动(即SOP
Class)。在不肯情状下,SCP可有选取的归来Diagnostic状态码以通知客户端被拒绝的原由;最差的情事下,服务端SCP只回去”Calling
AE Title not
recognized“。在拒绝状态下,DICOM连接就终止了,SCP和SCU无法传输数据;与此同时底层的TCP连接也会停业直到客户端SCU再三次发送连接请求。

小结分析:

       
本次调节和测试排除错误的进程中发觉,在组成移接分化文件的代码时要越发的瞩目细节部分。顺便借着此番传递丢失T_ASC_Association类型参数的难题,我们详细的分析一下传递失利的T_ASC_Associaton类型参数的效率,怎么轻巧的2个参数字传送递失利,就会招致C-STORE功用失效?

3)storescp.cc与scp.cc共同点:

        两者共同的拍卖流程如下图所示,

 

澳门威尼斯人网址 28

 

       
从上海教室能够看到,大家开头的估摸是正确的,利用DcmSCP是足以兑现storescp.exe工具的,那便是说为啥DC德州仪器给出的storescp.exe工具包未有用DcmSCP类来实现呢?估量有希望是DcmSCP类和storescp.exe工具的开拓者是互相职业的,由此也就不可能利用DcmSCP来落到实处storescp.exe工具了,并且两者的中央流程是如出壹辙的,也没要求对storescp.exe进行双重修改,究竟该工具的用途有限。

释放(终止)连接:

       
在一连建立今后,连接双方开始开始展览数据交换。假诺任何1方想终止连接(服务端SCP也足以),有二种艺术:

  • 出殡连接释放音讯;
  • 出殡连接终止音信;

       
第2种状态,接收到一连释放新闻的1方会向释放方发送一条确认音信。随后TCP连接关闭,DICOM连接终止,这是DICOM互连网连接中不奇怪的停业措施;第几种景况,客户端发送完遗弃音讯后,不等到服务端的肯定就主动关闭TCP连接。那种关闭是不正规的,平常是客户单境遇意外情状后产生的,那是DICOM中唯11种不须求服务端发送响应消息的央浼音讯。当然还有第三种中断格局,正是一直关门TCP连接,那种状态屡屡是出于硬件错误所导致的。

一)Presentation Context、AbstractSyntax、TransferSyntax细节学习

        在上一篇博文中大家摘录了DICOM三.0专业中关于Presentation
Context、AbstractSyntax、TransferSyntax多少个名词的解释,通俗一点来讲正是Presentation
Context代表的是多个应用实体(AE=Applicaiton
Entity)交互的条件(平时号称上下文),它富含前边的AbstractSyntax和TransferSyntax名词。AbstractSyntax与TransferSyntax相比较轻巧模糊正是因为英文单词中都涵盖了Syntax,事实上相互完全是例外的定义,AbstractSyntax关心的是上层信息,即三个彼此的AE之间
举办的是何种交互,也便是正经中所说的劳务目的对(SOP)的类型,通过查阅dcuid.h文件能够,AbstractSyntax有Store、Query/Retrive、Worklist等类型,例如Store类型的UID_CTImageStorage 、Query/Retrive类型的UID_FINDPatientRootQueryRetrieveInformationModel、Worklist类型的UID_FINDModalityWorklistInformationModel等等。那多少个是咱们在C-ECHO、C-STORE、C-FIND服务中常用到的二种;而TransferSyntax关心的是信息传输交互时的编码规则,是Explicit还是Implicit,是LittleEndian还是BigEndian,常见的有UID_LittleEndianImplicitTransferSyntax、UID_LittleEndianExplicitTransferSyntax等等,具体的能够自行查看dcuid.h文本。而地点传递丢失的presID参数便是总结了那二种最根本的相互音讯。因而会促成整个C-STORE服务战败。

模仿构建和谐的C-STORE SCP:

数据沟通(Date Exchange)DIMSE:

       
利用ACSE新闻成功建立连接后,即客户端发送的伸手至少有一种上下文描述的劳务棉被和衣服务端接受,真正的数码开端沟通,例如一张或多张CT图像、worklist查询、打字与印刷请求等。如上所述,DICOM协议规定了1一种DIMSE音信,各类都可以视作客户端的呼吁大概服务端的响应。1一种DIMSE新闻如下:C-CTORE、C-GET、C-MOVE、C-FIND、C-ECHO、N-EVENT-REPORT、N-GET、N-SET、N-ACTON、N-CREATE、N-DELETE。全部的信息都能够被差异的劳动应用,依据Presentation
Context的描述,你只须求中间的壹种或三种。

2)storescp.cc与scp.cc全部再对照

       
那么storescp.exe工具包和DcmScp类又是在何以时刻?什么岗位来安装那些参数的吧?下边大家就再叁回比较分析一下二种工具的贯彻流程(细节可参照上1篇博文DICOM医学图像处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求)。

一)直接行使DcmSCP自行建造C-STORE SCP端:

       
通过上一节的解析,我们决定尝试选取DcmSCP类来创设C-STORE的SCP端,来顶替storescp.exe工具。

       
利用VS2011创设C++的工程,命名称为C-STORETest,直接利用DcmSCP类来贯彻C-STORE的SCP端,具体代码如下:

 

[cpp] view
plain
copyprint?澳门威尼斯人网址 29澳门威尼斯人网址 30

 

  1. // C-STORETest.cpp : 定义调节台应用程序的入口点。  
  2. //  
  3.   
  4. #include “stdafx.h”  
  5.   
  6.   
  7. //add the include files of Dcmtk library  
  8. #include “dcmtk/config/osconfig.h”  
  9. #include “dcmtk/dcmdata/dctk.h”  
  10. #include “dcmtk/dcmnet/scp.h”  
  11. #include “ZSDcmStoreSCP.h”  
  12. #include “global.h”  
  13.   
  14. int _tmain(int argc, _TCHAR* argv[])  
  15. {  
  16.     DcmSCP mStoreSCP;  
  17.     mStoreSCP.setAETitle(“ZS-TEST”);  
  18.     mStoreSCP.setPort(104);  
  19.     mStoreSCP.setVerbosePCMode(true);  
  20.     mStoreSCP.setACSETimeout(-1);  
  21.     mStoreSCP.setDIMSETimeout(10000);  
  22.     mStoreSCP.setDIMSEBlockingMode(DIMSE_NONBLOCKING);  
  23.     OFList< OFString > transferSyntaxes;  
  24.     transferSyntaxes.push_back(UID_LittleEndianExplicitTransferSyntax);  
  25.     transferSyntaxes.push_back(UID_LittleEndianImplicitTransferSyntax);  
  26.     mStoreSCP.addPresentationContext(UID_CTImageStorage,transferSyntaxes);  
  27.     //mStoreSCP.SET  
  28.     mStoreSCP.listen();  
  29.   
  30.     return 0;  
  31. }  

 

 

 

       
编写翻译实现后,展开贰个cmd客户端,运营storescu.exe与大家自行建造的C-STORETest举行两次三番,得到的结果如下:

澳门威尼斯人网址 31

       
发现服务端(上海教室左侧)给出的荒谬提醒突显“不恐怕处理该品种的DIMSE请求”,而客户端(上海体育场面左侧)显示一连被甘休(Aborting
Association)。这是哪些来头呢?后来因此本身阅读OFFIS官方网站关于DcmSCP类的叙述后,找到了难题的案由。原来DcmSCP类的兑现还处于测试实验阶段,DcmSCP给出的listen函数内部一时半刻只能处理C-ECHO请求,

 

澳门威尼斯人网址 32

 

 

澳门威尼斯人网址 33

 

       
依照合法的升迁,要想完毕相应C-STORE指令,需求大家手动扩充DcmSCP类。(原来那样,由此看来之所以没有使用DcmSCP来落到实处storescp.exe工具的确实原因是DcmSCP作用还不周全,并无法处理C-STORE指令)。

PDU-Protocol Data Units:

       
在DICOM系统连接中,各种DIMSE新闻在传输进程中会被分割成多少个部分,叫做Protocol
Data
Unit,简称PDU。PDU的深浅也是接二连三建立进度中探讨的。每八个PDU片段中会包括贰个与Presentation
Context ID相关的数字。我们能够将每2个Presentation
Context看做双方沟通的逻辑通道,通过在PDU中富含Presentation Context
ID,接收端才清楚PDU属于哪一个坦途,本领将多少个PDU片段举行重组。

二.一 scp.cc源码文件

        借助上1篇博文的图片来分析一下DcmSCP类中对于Presentation
Context(即AbstractSyntax和TransferSyntax)的具体操作。

澳门威尼斯人网址 34

        上海体育场合中提交了DcmSCP类中设置Presentation
Context上下文环境的具体地点和选拔的函数。

2)扩展DcmSCP类处理C-STORE请求:

       
既然找到了难点所在,那么我们就依据法定的传教尝试对DcmSCP实行扩张,增添处理C-STORE指令的有个别。直白的想法是将storescp.exe工程中的针对C-STORE请求的处理函数提收取来,增加到DcmSCP的扩张类ZSDcmStoreSCP中。由此在ZSDcmStoreSCP类中增添了函数storeSCP、storeSCPCallback,如下图所示:

 

澳门威尼斯人网址 35

 

       
同样须要对listen函数举办增加。原本以为只须求重载DcmSCP中拍卖DIMSE具体CommandSet的函数handleIncomingCommand就可以,可是在扩充进度中发现storescp.exe处理C-STORE的函数storeSCP和storeSCPCallback都要以T_ASC_association类型为参数,而DcmSCP的m_assoc是个人变量并且未有留住我们赢得该民用变量的接口,因此不能够将storeSCP、storeSCPCallback函数直接助长到handleIncomingCommand内部。
  

       
为了贯彻直接选取storeSCP、storeSCPCallback函数,大家必须想艺术获得T_ASC_association变量assoc,通过上述对DcmSCP的源码剖析大家能够,在waitForAssociation函数内部调用ASC_receiveAssociation之后,DcmSCP才从T_ASC_Network出获得到了客户端的T_ASC_association连接变量assoc。那么大家是或不是能够因此重载waitForAssociation函数来提抽出assoc变量呢?在品尝那给ZSDcmStoreSCP类增添新的分子变量T_ASC_association*
zs_assoc后,将waitForAssociation内部的调用基类DcmSCP中m_assoc的地点统统换到zs_assoc,直接调换后发觉,我们须要重载的不只waitForAssociation一个函数,诸如dropAndDestroyAssociation、negotiateAssociation、refuseAssociation等等函数都供给再行覆盖,关键是waitForAssociation内部的基本函数handleAssociation也要覆盖,因为该函数并不需求任何参数(见上一节的【注2】),其里面直接调用的就是DcmSCP的私家成员变量m_assoc,故此为了提取一个m_assoc变量,大家须要将DcmSCP基类中的众多函数进行重写,那还算上的是对DcmSCP的派生扩展么?

       
在并未有找到很好的消除办法在此以前,作者将waitForAssociation函数和handleAssociation函数内部的源码直接剪切出来一齐放到了listen函数内部,然后用咱们本人的zs_assoc替换掉了DcmSCP的m_assoc,如是从ZSDcmStoreSCP外观上看来笔者只对DcmSCP类的listen函数、handleIncomingCommand函数实行了扩张而已,其余将storescp.exe中的storeSCP和storeSCPCallback函数加多到ZSDcmStoreSCP类中,为了使得上述四个函数可以顺遂运行,也加多了略微storescp.exe中定义的命令行参数变量。

DIMSE Message Data:

       
每一个DIMSE信息所传输的内容各有区别,请求新闻(request)中根本包含:

  • Message ID:在连年中每个音信的绝无仅有标示
  • Affected SOP Class UID:DIMSE音信中钦定的SOP Class,即Presentation
    Context中钦命的Abstract Syntax。
  • Affected SOP Instance
    UID:真正传输的实体数据标记符,例如地点例子中涉及的乳腺X光片数据
  • Priority:音信的优先级,分为HIGH
    、NO瑞鹰MAL、LOW三种,可是大多接收端都忽略。
  • Data Set:传输的数码。

       
响应新闻(response)内容与上述类似。首先包含3个气象新闻,例如0代表成功;其余与Message
ID对应的是Message ID Being Responsed To,通过拷贝并回到请求端的Message
ID,使得接收端知道响应音讯的对象。

贰.二 storescp.exe源码文件

       
想必storescp.exe工具包中的安装流程也基本是形似的,接下去大家1致依靠上一篇博文的图来分析一下。

澳门威尼斯人网址 36

       
相比多少个图片大家能够发现DcmSCP和storescp.exe都是在拍卖真的的DIMSE音讯在此之前对再三再四的Presentation
Context上下文进行配备,至于那样多UID(无论是AbstractSyntax照旧TransferSyntax都以在dcuid.h文件中用联合的UID来定义的)仓库储存到何地了啊?结缘上1篇博文的辨析,大家清楚外部循环初步后第一的着力函数都有一个T_ASC_Association类型的参数assoc(storescp.exe中)或m_assoc(DcmSCP类中),查看一下T_ASC_Association类型的定义,并逐级展开,能够窥见比较大家预料中的相同,该变量中储存了延续的上下文的全数UID,如下图所示:

澳门威尼斯人网址 37

       
至此大家对此DcmSCP类和storescp.exe工具的源码的辨析总算告壹段落了,希望大家能够对DICOM的互连网通信服务有三个越来越深切的认识。

标题浅析:

开源库中相应的落实:

叁)对新版DCMediaTek中DcmSCP和DcmStoreSCP实现的开首狐疑

       
通过本次利用DcmSCP类的工程意识,该类的筹划有个别不妥,开放的接口不够合理,不能轻巧的落实扩张来响应C-STORE等其他请求。推测新版的DC德州仪器料定会进行修改,通过翻看dcmtk三.陆.一的官方认证,发现新版的dcmtk开源库中确实对DcmSCP和DcmSCU基类实行了大的改换,开放了成都百货上千新的接口(如下图)方便用户进行增加,其它新版的库中央直机关接提交了打包好的DcmStoreSCP和DcmStoreSCU类,所以我们就不要使用作者付出的代码ZSDcmStoreSCP类啦,仅供测试使用,具体使用是仍旧不久安装新型版的dcmtk开源库吧。

 

澳门威尼斯人网址 38

 

一)ZSDcmStoreSCP无法响应原本DcmSCP能够响应的C-ECHO:

       
将上述成功的ZSDcmStoreSCP类增多到工程中,创立ZSDcmStoreSCP对象,调用listen()函数(具体代码如下),运行服务端程序,一样选用storescu.exe进行客户端模拟,测试发现连C-ECHO也无能为力响应。

 

[cpp] view
plain
copyprint?澳门威尼斯人网址 39澳门威尼斯人网址 40

 

  1. // C-STORETest.cpp : 定义调控台应用程序的入口点。  
  2. //  
  3.   
  4. #include “stdafx.h”  
  5.   
  6.   
  7. //add the include files of Dcmtk library  
  8. #include “dcmtk/config/osconfig.h”  
  9. #include “dcmtk/dcmdata/dctk.h”  
  10. #include “dcmtk/dcmnet/scp.h”  
  11. #include “ZSDcmStoreSCP.h”  
  12. #include “global.h”  
  13.   
  14. int _tmain(int argc, _TCHAR* argv[])  
  15. {  
  16.       
  17.     ZSDcmStoreSCP mZSStoreScp;  
  18.     mZSStoreScp.setAETitle(“ZS-TEST”);  
  19.     mZSStoreScp.setPort(104);  
  20.     mZSStoreScp.setVerbosePCMode(true);  
  21.     mZSStoreScp.setACSETimeout(-1);  
  22.     mZSStoreScp.setDIMSETimeout(10000);  
  23.     mZSStoreScp.setDIMSEBlockingMode(DIMSE_NONBLOCKING);  
  24.     OFList< OFString > transferSyntaxes;  
  25.     transferSyntaxes.push_back(UID_LittleEndianExplicitTransferSyntax);  
  26.     transferSyntaxes.push_back(UID_LittleEndianImplicitTransferSyntax);  
  27.     mZSStoreScp.addPresentationContext(UID_CTImageStorage,transferSyntaxes);  
  28.     //mStoreSCP.SET  
  29.     mZSStoreScp.listen();  
  30.   
  31.   
  32.   
  33.     return 0;  
  34. }  

 

 

 

澳门威尼斯人网址 41

       
从上海体育场地能够看书,客户端在发送完A-ASSOCIATE-PRADOQ消息后,再无响应而直白出现了连年请求退步。再次行使上1篇博文中选用的RawCap.exe抓取本地回路数据包,利用Wireshark查看数据包发现,客户端在出殡和埋葬完A-ASSOCIATE-本田CR-VQ后,服务端并未发送A-ASSOCIATE-景逸SUVSP,因此鲜明难点出在了我们协调包裹的ZSDcmStoreSCP内部。

澳门威尼斯人网址 42

       
单步调节和测试后意识,在函数判断过程中,assoc->presentationContextList变量为空,由此估计对ASC_receiveAssociation接收到客户端的链接assoc后的ASC_相关布置卓殊(参见上1节的【注1】)。

澳门威尼斯人网址 43

       
通过排查发今后拆除waitForAssociation函数时将ASC_receiveAssociation函数后边的累累ASC_开首的函数给漏掉了,将该段代码补充完全(如下图所示),

 

澳门威尼斯人网址 44

 

DCMTK:

       
DCMediaTek开源库更偏重于根据层(Layer)来落实DICOM应用实体(AE)之间的接连(ACSE)及新闻传输(DIMSE),首要分为DIMSE(应用层)、ACSE(属于OSI柒层协议中的应用层)和DUL(Dicom
Upper
Layer层,该层与OSI中的TCP/IP层对接)3超越60%。用户通过行使DCMTK提供的DICOM协议中规定的各层的数据结构和操作函数,遵照DICOM标准中显明的流水生产线来实现和谐的DICOM服务。

       
dimse.h/dimse.cc中付出了DICOM协议中明确的各个劳动对应的结构体,以T_DIMSE_为前缀,例如T_DIMSE_C_StoreRQ/T_DIMSE_C_StoreRSP、T_DIMSE_FindRQ/T_DIMSE_FindRSP、T_DIMSE_CEchoRQ/T_DIMSE_CEcho普拉多SP等;其余给出了种种服务对应的操作函数的扬言,以DIMSE_为前缀,例如DIMSE_echoUser/DIMSE_sendEchoResponse、DIMSE_storeUser/DIMSE_storeProvider/DIMSE_sendStoreResponse等等,具体对应的函数定义被分级位居了单独的文本中,首要有dimecho.cc、dimfind.cc、dimget.cc、dimmove.cc、dimstore.cc。

       
assoc.h/assoc.cc中付出了ACSE应用层的应和结构的包装,以T_ASC_为前缀,例如T_ASC_Parameters、T_ASC_Association、T_ASC_PresentationContext等等;别的给出了对应的总是建立或刹车的操作函数,以ASC_为前缀,例如ASC_initializeNetwork、ASC_dropNetwork、ASC_requestAssociation、ASC_receiveAssociation、ASC_acknowledgeAssociation、ASC_rejectAssociation、ASC_releaseAssociation等等。

        在dul.h/dul.cc中提交了Dicom Upper
Layer层的连锁数据结构,以DUL_为前缀,例如DUL_ASSOCIATESERVICEPARAMETERS、DUL_PRESENTATIONCONTEXT、DUL_TRANSFERSYNTAX、DUL_PDV、DUL_PDVLIST;此外给出了DUL层的操作函数,一样以DUL_为前缀,例如DUL_InitializeNetwork、DUL_RequestAssociation、DUL_ReleaseAssociation、DUL_ReadPDVs、DUL_WritePDVs、DUL_NextPDV等等。

实例工程代码下载:

一)CSDN能源下载:

连接:http://download.csdn.net/detail/zssureqh/7906309,需求一个积分奥。

贰)Github免费下载

连接:https://github.com/zssure-thu/CSDN

 

二)ZSDcmStoreSCP响应C-STORE请求有误:

       
重新编写翻译,利用storescu.exe进行测试,测试结果如下,通过利用Wireshark观察RawCap.exe抓取的数据包能够一定此次C-ECHO请求能够如愿响应,不过对于C-STORE的伸手在保存dcm文件的时候出现了难题。时下还未查清楚具体难点现身在哪些地点。

澳门威尼斯人网址 45

澳门威尼斯人网址 46

fo-dicom:

       
fo-dicom开源库更偏重于依据DICOM新闻流来封装,在贯彻了整机DIMSE新闻流框架的功底上,给用户预留了各等级的接口,方便用户继续自定义完成。

       
PDU.cs中提交了ACSE应用层对应的劳务对象,重要有RawPDU、PDU、A-Associate-EscortQ、A-Associate-AC、A-Associate-路虎极光J、A-Release-CR-VQ、A-Release-RP、A-Abort、PDataTF。

       
DicomMessage为基类派生出的一文山会海子类,例如DicomRequest/DicomResponse、DicomCEchoRequest/DicomCEchoResponse、DicomCStoreRequest/DicomCStoreResponse等等;该部分对DICOM协议中明确的种种新闻实行了响应的包装。

       
DicomService类中付出了全副DICOM协议中鲜明的SCP/SCU之间相互的流水线,不过对于差异的ACSE应用层的接二连三操作和DIMSE层的新闻操作都留出了对应的接口,通过调用后续的回调函数来促成用户自身的企图。

       
IDicomServiceUser/IDicomServiceProvider、IDicomCStoreProvider、IDicomCEchoProvider等为底蕴的壹多元接口类,该片段交给了DicomService中壹密密麻麻操作的回调函数接口,具体的兑现由用户自个儿成功。

       
DicomClient/DicomServer为底蕴的实体类,该类是用户本身搭建SCP和SCU两端的必须类,能够说DicomClient和DicomServer便是一对简易完结的DICOM服务的SCU和SCP。例如fo-dicom自带的实例中var
server = new
DicomServer<DicomCEchoProvider>(12345);就敞开了三个端口号为123肆伍的吸收接纳C-ECHO服务的SCP服务端;var
client = new
DicomClient();client.NegotiateAsyncOps();client.AddRequest(new
DicomCEchoRequest());就兑现了三个简便的发起C-ECHO请求的SCU客户端。

三番五次专栏博文预报:

1)dcmtk3.6.0的DcmSCP与dcmtk3.6.1的DcmSCP分析,以及dcmtk3.6.1的DcmStoreSCP和DcmStoreSCU的使用

二)Dcmtk与fo-dicom保存文件的差别设计方式:单线程VS10二线程

三)wlmscpfs.exe与findscu.exe的源码剖析:学习C-FIND请求

知识点补充:

       
上述storescp.cc和scp.cc中冒出了大气的ASC_XXX函数和DIMSE_XXX函数,那与我们前1篇博文分析的DICOM网络通信服务全体布局是相契合的,借着此番达成C-STORE请求响应的长河再一次熟谙一下DICOM三.0正经中的多少个概念,特别是第二遍出现布局错误时的TransferSyntax和PresentationContext,加深一下明白。

(该片段同样依旧一贯摘抄自DICOM三.0正经的英文官方版,同样不做翻译,实在是英文不好,技巧轻易,静候国内大拿出现)

Presentation Context– the set of DICOM network services used over
an Association, as negotiated between Application Entities;includes
Abstract Syntaxesand Transfer Syntaxes.

Transfer Syntax– the encoding used for exchange of DICOM
information objects and messages.Examples: JPEGcompressed
(images), little endian explicit value representation.

Abstract Syntax – the information agreed to be exchanged between
applications, generally equivalent to a Service/Object Pair (SOP)
Class.Examples : Verification SOP Class, Modality Worklist
Information Model Find SOP Class, Computed Radiography Image Storage
SOP Class.

Service/Object Pair (SOP) Class– the specification of the
networkor media transfer (service) of a particular type of data
(object); the fundamentalunit of DICOM interoperability
specification.Examples: Ultrasound Image Storage Service, Basic
Grayscale Print Management.

Service/Object Pair (SOP) Instance– an information object; a
specific occurrence of information exchanged in a SOP
Class.Examples: a specific x-ray image.

Presentation Context consists of an Abstract Syntax plus a list of
acceptable Transfer Syntaxes. The Abstract Syntax identifies one SOP
Class or MetaSOP Class (a collection of related SOP Classes identified
by a single Abstract Syntax UID). By listing the Application Entities
with their proposed and accepted Presentation Contexts, the
Conformance Statement is identifying the set of Information Objects
and Service Classes which are recognized by this implementation。

TransferSyntax是Presentation Context属性的1种;

TransferSyntax只对DICOM 音信中的Data Set部分生效。

TransferSyntax是描述真实世界中一种或两种Abstract
Syntax的编码规则。

 

澳门威尼斯人网址 47

 

DICOM三.0正规分析:

备注:

       
原本目的在于通过扩张DcmSCP类来轻便加欢欣的虚伪storescp.exe工具,不过在贯彻进度中窥见dcmtk三.陆.0版本中的DcmSCP类设计存在着欠缺,使得后续的接续和扩充相比较吃力。寻找OFFIS的官方网址发现,在眼下新发布的dcmtk三.6.1本子中,竟然给出了DcmStoreSCP和DcmStoreSCU八个C-STORE请求处理类,而且分别派生自DcmSCP和DcmSCU,不亮堂OFFIS的大师傅是不是对DcmSCP类举行了改动?一连会对新版DcmSCP与旧版DcmSCP的比较,以及DcmStoreSCP和DcmStoreSCU的使用举行解析,期望找到本文中出现难点的解决方法(注:在下一篇博文中再交付实现的ZSDcmStoreSCP类的代码)。

 

(未完待续……)

 

 

PDU vs PDV:

        DCMTK三.0正式中对此PDU(Protocol Data
Unit)的演讲和概念与地点博文中介绍的平等,不过对于PDV在专业中有两种解释分别是Protocol
Data Value和Presentation Data
Value,笔者更偏向于后人。上边博文中介绍的PDU指的是在DICOM连接建立之上传递的音讯片段,英文原稿是“If
such a message is transferred on a DICOM connection, they are cut into
pieces, so called Protocol Data Unit
(PDUs).”——那里要求专注的是message,并不只指大家所说的DICOM
Message(参见图一),还包涵了ACSE协议中行使的连年新闻,例如A-ASSOCIATION-LX570Q、A-ASSOCIATION-君越SP、A-ABORT,该类消息在DICOM3.0商谈的第九局地有详尽的牵线(参见图二)。

        在图第22中学P-DATA-TF PDU结构中的Variable
Field可变区域才是PDV,即Presentation Data Value。那里PDV指的是DICOM
Message在现实传输进度中被划分的多个部分(该片段在DICOM三.0行业内部第八有的的附录E中有详细介绍,参见图叁,其实正是上文中提到的DIMSE
Message
Data)。在fo-dicom中的PDU.cs文件中可验证,在那之中PDU的子类P-DATA-TF的分子中带有一个PDV的链表,即List<PDV>。

     
  一句话计算:PDU指的是DICOM协议中的传输的各个新闻(包罗ACSE和DIMSE)的壹些,PDV专指DICOM
Message被划分后的部分,属于P-DATA-TF类PDU中的Variable Field部分。

 

澳门威尼斯人网址 48

 

 

澳门威尼斯人网址 49

澳门威尼斯人网址 50

 

后续博文预报:

一)storescp.exe与sotrescu.exe的源码剖析:学习C-STORE请求(续)
2)dcmtk3.6.0的DcmSCP与dcmtk3.6.1的DcmSCP分析,以及dcmtk3.6.1的DcmStoreSCP和DcmStoreSCU的使用
三)Dcmtk与fo-dicom保存文件的不及设计方式:单线程VS二十三二十四线程
四)wlmscpfs.exe与findscu.exe的源码剖析:学习C-FIND请求

ACSE vs DIMSE:

        ACSE是在DICOM3.0中的第7某些介绍,该有的的标题为Network
Communication Support for Message
Exchange,由此得以确定ACSE主要应用户连接建立阶段。
连接(Association)的树立是八个DICOM实体(AE)之间开始展览互动的第二步,AEs在确立的连日上开始展览数据编码格式、传输格局的磋商。DICOM
AEs利用ACSE-ASSOCIATE服务来确立连接,在ACSE-ASSOCIATE服务中任重先生而道远使用的是Application
Context、Presentation Context和User Information
Items(在DICOM三.0正式第9有个其余附录三中有详实的介绍)。ACSE服务主要有A-ASSOCIATE、A-RELEASE、A-ABORT、A-P-ABORT、P-DATA五类,对应的PDU有A-ASSOCIATE-CRUISERQ、A-ASSOCIATE-AC、A-ASSOCIATE-福特ExplorerJ、P-DATA-TF、A-RELEASE-路虎极光Q、A-RELEASE-RP、A-ABORT各样。

        DIMSE是在DICOM三.0中的第8部分介绍,该部分的标题为Message
Exchange,由此评释DIMSE是对DICOM传输信息的分明。DIMSE服务类型有C-STORE、C-GET、C-MOVE、C-FIND、C-ECHO、N-EVENT-REPORT、N-GET、N-SET、N-ACTION、N-CREATE、N-DELETE,如下图。

 

澳门威尼斯人网址 51

 

       
有上述比较能够看出ACSE是DIMSE的功底,DIMSE是在ACSE之上落成的。正如PDU vs
PDV中涉及的,DIMSE
Message是在Association建立达成后,通过ACSE中的P-DATA-TF服务来传输,各类DIMSE
新闻会被细分成PDVs放入到P-DATA-TF的Variable 菲尔德。如下图所示:

 

澳门威尼斯人网址 52

 

       
最终通过查阅fo-dicom中的Dicom瑟维斯.cs中EndPDU和ProcessPDataTF函数能够有七个更形象的驾驭,在EndPDU函数内部通过读取PDU的前四个字节来辨别PDU属于ACSE中的哪壹种服务,例如A-ASSOCIATE-RubiconQ、A-ASSOCIATE-AC、A-ASSOCIATE-昂CoraJ、P-DATA-TF、A-RELEASE-奥迪Q3Q、A-RELEASE-RP、A-ABORT;当PDU属于P-DATA-TF类型时,进入到ProcessPDataTF函数内部。通过提取P-DATA-TF
PDU中的Variable
Field中的PDVs来鉴定识别是哪1种DIMSE音讯,首要有C-STORE-君越Q/C-STORE-君越SP、C-FIND-CR-VQ/C-FIND-奥迪Q5SP、C-ECHO-奇骏Q/C-ECHO-HavalSP、C-MOVE-卡宴Q/C-MOVE-帕杰罗SP等等。

 

参考资料:

http://support.dcmtk.org/redmine/projects/dcmtk/wiki/DICOM_NetworkingIntroduction#Protocol-Data-Units,本文英文原版的书文

http://medical.nema.org/medical/dicom/current/output/html/part07.html,DICOM3.0标准第7部分

http://medical.nema.org/medical/dicom/current/output/html/part08.html,DICOM3.0标准第8部分

https://github.com/redmoxie/fo-dicom,fo-dicom源码

http://support.dcmtk.org/redmine/projects/dcmtk/files,DCMTK源码

 

接轨专栏博文介绍:

利用PHP Skel结合DCMTK开发WEB PACS应用

应用oracle直接操作DICOM数据

C#的异步编程形式在fo-dicom中的应用

VMWare二种网络连接方式的骨子里测试