DICOM医学图像处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求

背景:

        上一篇专栏博文中针对PACS终端(或设备终端,如CT设备)与RIS系统之间worklist查询进行了介绍,并着重对比分析了DICOM3.0中各部分对DICOM网络通讯服务的定义。此次通过结合早些时间的博文DICOM医学图像处理:基于DCMTK工具包学习和分析worklist,对DCMTK开源库中提供的storescp.exe和storescu.exe工具的源码进行剖析,从底层深入了解C-STORE服务的触发及响应。

分析思路:

        storescp.exe和storescu.exe分别充当着C-STORE服务的SCP和SCU,因此猜测两个工具包一定是利用了DCMTK提供的DcmSCP和DcmSCU类来分别实现的。为了验证自己的想法,从分析storescp.exe源码文件storescp.cc入手,对比storescp.cc与scp.cc,寻找两者的共同点。倘若与我们的设想一致,就新建一个C++本地工程,利用DcmSCP类来建立自己的C-STORE SCP端,期望达到与storescp.exe工具包相同的效果。

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

1)storescp.cc源码分析

        storescp.cc是DCMTK提供的storescp.exe工具的源文件。直接打开storescp.cc文件,首先可以看到作者给出的注释:

        Purpose概括了该工具的主要用途——是存储服务的提供者,用来响应C-STORE 操作。由于storescp.exe是一个命令行工具,即用户可以通过不同的参数设置或组合来实现不同的功能。因此在storescp.cc文件开头main主函数外部定义了众多全局的命令行参数变量,例如我们上一篇博文DICOM医学图像处理:全面分析DICOM3.0标准中的通讯服务模块中使用的storescp.exe -d 104 -aet OFFIS命令行中的104相对应的参数是opt_port, 从参数opt_前缀亦可以猜出用途。

        由于storescp.exe工具是需要与客户端进行交互的,接下来进入到main主函数后的第一件事情就是初始化网络环境。如下图所示,作者利用条件编译(如下图中的红圈所示)以来实现不同系统的网络环境的初始化,由于我使用的是Windows7操作系统,因此条件编译的结果是调用WSAStartup初始化Windows 套接字(Socket)的网络环境。

        网络环境的初始化是main函数的第一步操作,随后就是前面提到的命令行参数的解析,因为storescpp.exe是命令行类型的工具包。从文件260行至992行就是命令行参数的解析部分,我们暂时直接跳过该部分,简单地认为该部分实现的功能就是对应参数的赋值。

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

第一步,加载DICOM字典文件。该步骤几乎是所有与DICOM操作相关的文件的第一步。其实就是加载一个预先写好的包含各种DICOM3.0标准中规定的字段的文本文件。

第二步,初始化网络连接,创建网络连接的一个实例,格式为T_ASC_Network(如下图),记住该类型,不要与后面出现的T_ASC_Association混淆了。其实在第一步和第二步之间我们省略了部分代码,该部分主要是用来控制storescp.exe工具的运行机制,是单线程还是多线程。

第三步,进入外层while循环。在利用ASC_initializeNetwork初始化网络环境后,就进入到了while循环内的acceptAssociation函数。这也是正常情况下,while循环中唯一的工作函数。随后就是待连接断开后的收尾工作。

第四步,单步调试进入acceptAssociation函数内部。从函数前面的注释了解到函数是用来接收处理链接请求的,注意看函数的参数,传递进去的是上面我们初始化后获得的网络连接变量net,ascfig是通过解析命令行而获得的配置参数。

第五步,函数acceptAssociation内部开始通过调用ASC_receiveAssociation来尝试获取客户端的连接请求,该函数与socket编程中的accept函数类似,可以设置阻塞模式和非阻塞模式(关于套接字的阻塞模式和非阻塞模式的区别可参见《Windows网络编程》)。调用该函数后storescp.exe工具就暂停,等待客户端发起链接。

第六步,当有客户端连接进入后,ASC_receiveAssociation函数返回,随后会出现众多以ASC_为前缀的函数,主要有ASC_acceptContextsWithPreferredTransferSyntaxes、ASC_setAPTitles、ASC_getApplicationContextName,以及如果发生错误情况下会调用的ASC_rejectAssociation。参照博文DICOM医学图像处理:全面分析DICOM3.0标准中的通讯服务模块中的分析可知,以ASC_为前缀的函数属于DICOM3.0中的Association Managements,主要在第8部分讲解。用来实现上层DIM

  • 12
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zssure

己欲立而立人,己欲达而达人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值