dcmnet: bibliothèque réseau et applications utilitaires
Ce module contient un ensemble de fonctions qui implémentent la communication réseau DICOM, à savoir la machine à états finis de la couche supérieure DICOM (FSM), l'Association Control Service Element (ACSE) et le DICOM Message Service Element (DIMSE).
Les interfaces principales sont les structures et fonctions déclarées dans le fichier assoc.h et dans dimse.h.
Il existe également deux classes expérimentales pour implémenter un DICOM Service Class User et Provider :
Les classes suivantes dérivent des classes expérimentales ci-dessus et fournissent un service DICOM particulier :
Outils
Ce module contient les outils en ligne de commande suivants :
- dcmrecv: Simple DICOM storage SCP (receiver)
- dcmsend: Simple DICOM storage SCU (sender)
- echoscu: DICOM verification (C-ECHO) SCU
- findscu: DICOM query (C-FIND) SCU
- getscu: DICOM retrieve (C-GET) SCU
- movescu: DICOM retrieve (C-MOVE) SCU
- storescp: DICOM storage (C-STORE) SCP
- storescu: DICOM storage (C-STORE) SCU
- termscu: DICOM termination SCU
Fichiers
Les fichiers suivants fournissent une documentation complémentaire :
Exemples
L'exemple suivant montre un Echo SCU (Verification Service Class SCU) très simple. La majeure partie du code de gestion des erreurs a été omise par souci de concision, et le code spécifique à l'OS, comme l'initialisation de WinSock sous Win32, n'est pas non plus présenté.
T_ASC_Network *net; // structure réseau, contient la FSM DICOM de couche supérieure, etc.
ASC_initializeNetwork(NET_REQUESTOR, 0, 1000 / timeout /, &net);
T_ASC_Parameters *params; // paramètres de la demande d'association
ASC_createAssociationParameters(¶ms, ASC_DEFAULTMAXPDU);
// set calling and called AE titles
ASC_setAPTitles(params, "ECHOSCU", "ANY-SCP", NULL);
// the DICOM server accepts connections at server.nowhere.com port 104
ASC_setPresentationAddresses(params, "localhost", "server.nowhere.com:104");
// list of transfer syntaxes, only a single entry here
const char* ts[] = { UID_LittleEndianImplicitTransferSyntax };
// add presentation context to association request
ASC_addPresentationContext(params, 1, UID_VerificationSOPClass, ts, 1);
// request DICOM association
T_ASC_Association *assoc;
if (ASC_requestAssociation(net, params, &assoc).good())
{
if (ASC_countAcceptedPresentationContexts(params) == 1)
{
// the remote SCP has accepted the Verification Service Class
DIC_US id = assoc->nextMsgID++; // génère l'ID de message suivant
DIC_US status; // le statut DIMSE de la C-ECHO-RSP sera stocké ici
DcmDataset *sd = NULL; // le détail du statut sera stocké ici
// send C-ECHO-RQ and handle response
DIMSE_echoUser(assoc, id, DIMSE_BLOCKING, 0, &status, &sd);
delete sd; // le détail du statut ne nous intéresse pas ici
}
}
ASC_releaseAssociation(assoc); // libère l'association
ASC_destroyAssociation(&assoc); // détruit la structure assoc
ASC_dropNetwork(&net); // détruit la structure net