dcmnet: biblioteca de rede e aplicativos utilitários
Este módulo contém um conjunto de funções que implementam a comunicação em rede DICOM, ou seja, a máquina de estados finitos da camada superior DICOM (FSM), o Association Control Service Element (ACSE) e o DICOM Message Service Element (DIMSE).
As principais interfaces são as estruturas e funções declaradas no arquivo assoc.h e em dimse.h.
Também existem duas classes experimentais para implementar um DICOM Service Class User e Provider:
As classes a seguir derivam das classes experimentais acima e fornecem um serviço DICOM específico:
Ferramentas
Este módulo contém as seguintes ferramentas de linha de comando:
- 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
Arquivos
Os arquivos a seguir fornecem documentação adicional:
Exemplos
O exemplo a seguir mostra um Echo SCU (Verification Service Class SCU) muito simples. A maior parte do código de tratamento de erros foi omitida por questão de concisão, e o código específico do sistema operacional, como a inicialização do WinSock no Win32, também não é apresentado.
T_ASC_Network *net; // estrutura de rede, contém a FSM DICOM de camada superior etc.
ASC_initializeNetwork(NET_REQUESTOR, 0, 1000 / timeout /, &net);
T_ASC_Parameters *params; // parâmetros da solicitação de associação
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++; // gera o próximo ID de mensagem
DIC_US status; // o status DIMSE da C-ECHO-RSP será armazenado aqui
DcmDataset *sd = NULL; // o detalhe do status será armazenado aqui
// send C-ECHO-RQ and handle response
DIMSE_echoUser(assoc, id, DIMSE_BLOCKING, 0, &status, &sd);
delete sd; // não nos importamos com o detalhe do status
}
}
ASC_releaseAssociation(assoc); // libera a associação
ASC_destroyAssociation(&assoc); // destrói a estrutura assoc
ASC_dropNetwork(&net); // destrói a estrutura net