背景:
专栏之前写过许多关于DICOM协议的相关文章,有关于概念解析的理论性文章,也有实例演示的应用性文章。目的只有一个,希望能引导大家快速掌握DICOM协议,并着手进行自定义化开发。
目前DICOM协议实现有多种开源库,例如基于C++的DCMTK、基于C#的fo-dicom、基于Java的dcm4che。由于时间关系博文中的相关实例演示经常会穿插着使用三种开源库,因此具体到某一种库可能博文中并未给出示范工程。例如,近期有网友咨询希望利用DCMTK开源库自己动手实现C-FIND查询请求,并对服务端返回的信息进行定制化处理。因此周末动手编写了一个极简版的示例,代码裁剪于DCMTK开源库的findscu工程,供大家交流学习。
准备知识:
为了更好的理解代码示例,请耐心阅读之前专栏里的相关文章,如果已经对DICOM协议很了解且有过开发经验,或者干脆就想先动手敲代码,想从实践中学习,那么请自行跳到下一节。
在开始工作之前先阅读DICOM医学图像处理:DICOM网路传输了解DICOM协议的含义以及简单的建立规则,随后阅读DICOM医学图像处理:全面解析DICOM3.0标准中的通讯服务模块和DICOM:DICOM3.0网络通信协议(续)进一步了解DICOM协议,以及熟悉DCMTK开源库中对DICOM协议的具体实现。阅读完上述理论概念性文章后,进一步浏览下面两篇实例演示博文DICOM医学图像处理:基于DCMTK工具包学习和分析worklist、DICOM医学图像处理:利用fo-dicom发送C-Find查询Worklist 。
DCMTK实现C-FIND SCU:
待一切先验知识储备完成后,就可以进入我们的正题了,网友的需求是:
在阅读DICOM医学图像处理:基于DCMTK工具包学习和分析worklist、DICOM医学图像处理:利用fo-dicom发送C-Find查询Worklist 两篇实例博文后,希望利用DCMTK尝试发送C-FIND-RQ请求,然后将返回的C-FIND-RSP消息进行解析和后处理。
经过上述【准备知识】阶段后,想必大家已经了解了C-FIND请求建立的正题过程,因此不罗嗦了直接贴代码,用一个简单的实例来进行实际讲解。
a)网络环境初始化
//1)初始化网络环境
WSAData winSockData;
/* we need at least version 1.1 */
WORD winSockVersionNeeded = MAKEWORD( 1, 1 );
WSAStartup(winSockVe