storescu(1)
πΈ NAME πΈ
storescu β DICOM storage (C-STORE) SCU. Bestie, this is the storescu(1) page from the OFFIS DCMTK manual, and it's literally the βsend DICOM files to a peerβ main character π.
β¨ SYNOPSIS β¨
storescu [options] peer port dcmfile-in...
π DESCRIPTION π
The storescu application implements a Service Class User (SCU) for the Storage Service Class. For each DICOM file on the command line it sends a C-STORE message to a Storage Service Class Provider (SCP) and waits for a response. The application can be used to transmit DICOM images and other DICOM composite objects. Slay π
.
π PARAMETERS π
peerβ hostname of the DICOM peer πportβ tcp/ip port number of the peer πdcmfile-inβ DICOM file or directory to be transmitted π
π OPTIONS π
π general options π
-h,--helpβ print this help text and exit π«Ά--versionβ print version information and exit β--argumentsβ print expanded command line arguments π§-q,--quietβ quiet mode, print no warnings and errors π€«-v,--verboseβ verbose mode, print processing details π-d,--debugβ debug mode, print debug information π οΈ-ll,--log-levelβ[l]evel: string constant(fatal,error,warn,info,debug,trace): use levellfor the logger π-lc,--log-configβ[f]ilename: string: use config fileffor the logger ποΈ+v,--verbose-pcβ show presentation contexts in verbose mode π
π input options π
input file format:
+f,--read-fileβ read file format or data set (default) π+fo,--read-file-onlyβ read file format only π―-f,--read-datasetβ read data set without file meta information π§Ύ
input files:
+sd,--scan-directoriesβ scan directories for input files (dcmfile-in) π+sp,--scan-patternβ[p]attern: string(only with--scan-directories): pattern for filename matching (wildcards) π
Page note: # possibly not available on all systems β so don't come for me if your system says nope π
-r,--no-recurseβ do not recurse within directories (default) π«+r,--recurseβ recurse within specified directories π-rn,--no-renameβ do not rename processed files (default) π·οΈ+rn,--renameβ append.done/.badto processed files β β
π network options π
IP protocol version:
-i4,--ipv4β use IPv4 only (default) 4οΈβ£-i6,--ipv6β use IPv6 only 6οΈβ£-i0,--ip-autoβ use DNS lookup to determine IP protocol π
application entity titles:
-aet,--aetitleβ[a]etitle: string: set my calling AE title (default:STORESCU) π-aec,--callβ[a]etitle: string: set called AE title of peer (default:ANY-SCP) π
association negotiation profile from configuration file:
-xf,--config-fileβ[f]ilename, [p]rofile: string: use profilepfrom config filefποΈ
proposed transmission transfer syntaxes (not with --config-file):
-x=,--propose-uncomprβ propose all uncompressed TS, explicit VR with local byte ordering first (default) π«-xe,--propose-littleβ propose all uncompressed TS, explicit VR little endian first π£-xb,--propose-bigβ propose all uncompressed TS, explicit VR big endian first π-xi,--propose-implicitβ propose implicit VR little endian TS only π§Έ-xs,--propose-losslessβ propose default JPEG lossless TS and all uncompressed transfer syntaxes πΌ-xy,--propose-jpeg8β propose default JPEG lossy TS for 8 bit data and all uncompressed transfer syntaxes π±-xx,--propose-jpeg12β propose default JPEG lossy TS for 12 bit data and all uncompressed transfer syntaxes π-xv,--propose-j2k-losslessβ propose JPEG 2000 lossless TS and all uncompressed transfer syntaxes πΌοΈ-xw,--propose-j2k-lossyβ propose JPEG 2000 lossy TS and all uncompressed transfer syntaxes π¨-xt,--propose-jls-losslessβ propose JPEG-LS lossless TS and all uncompressed transfer syntaxes πΈ-xu,--propose-jls-lossyβ propose JPEG-LS lossy TS and all uncompressed transfer syntaxes π-xm,--propose-mpeg2β propose MPEG2 Main Profile @ Main Level TS only π¬-xh,--propose-mpeg2-highβ propose MPEG2 Main Profile @ High Level TS only π₯-xn,--propose-mpeg4β propose MPEG4 AVC/H.264 High Profile / Level 4.1 TS only πΉ-xl,--propose-mpeg4-bdβ propose MPEG4 AVC/H.264 BD-compatible HP / Level 4.1 TS only πΏ-x2,--propose-mpeg4-2-2dβ propose MPEG4 AVC/H.264 HP / Level 4.2 TS for 2D Videos only ποΈ-x3,--propose-mpeg4-2-3dβ propose MPEG4 AVC/H.264 HP / Level 4.2 TS for 3D Videos only π₯½-xo,--propose-mpeg4-2-stβ propose MPEG4 AVC/H.264 Stereo HP / Level 4.2 TS only π§-x4,--propose-hevcβ propose HEVC/H.265 Main Profile / Level 5.1 TS only π₯-x5,--propose-hevc10β propose HEVC/H.265 Main Profile / Level 5.1 TS only π₯-xr,--propose-rleβ propose RLE lossless TS and all uncompressed transfer syntaxes π§©-xd,--propose-deflatedβ propose deflated explicit VR little endian TS and all uncompressed transfer syntaxes π«§-R,--requiredβ propose only required presentation contexts (default: propose all supported) π¨
Page note: # This will also work with storage SOP classes that are supported by DCMTK but are not in the list of SOP classes proposed by default. β yes bestie, that's the tea β
+C,--combineβ combine proposed transfer syntaxes (default: separate presentation context for each TS) π§¬
post-1993 value representations:
+u,--enable-new-vrβ enable support for new VRs (UN/UT) (default) β¨-u,--disable-new-vrβ disable support for new VRs, convert toOBπ§±
deflate compression level (only with --propose-deflated or --config-file):
+cl,--compression-levelβ[l]evel: integer(default:6):0=uncompressed,1=fastest,9=best compression ποΈ
user identity negotiation:
-usr,--userβ[u]ser name: string: authenticate using user nameuπ-pwd,--passwordβ[p]assword: string(only with--user): authenticate using passwordpπ-epw,--empty-passwordβ send empty password (only with--user) π«₯-kt,--kerberosβ[f]ilename: string: read kerberos ticket from filefπ«--samlβ[f]ilename: string: read SAML request from filefπ--jwtβ[f]ilename: string: read JWT data from filefπͺͺ-rsp,--pos-responseβ expect positive response π
other network options:
-to,--timeoutβ[s]econds: integer(default: unlimited): timeout for connection requests β³-ts,--socket-timeoutβ[s]econds: integer(default:60): timeout for network socket (0for none) π§¦-ta,--acse-timeoutβ[s]econds: integer(default:30): timeout for ACSE messages π¨-td,--dimse-timeoutβ[s]econds: integer(default: unlimited): timeout for DIMSE messages π-pdu,--max-pduβ[n]umber of bytes: integer(4096..131072): set max receive pdu tonbytes (default:16384) π¦--max-send-pduβ[n]umber of bytes: integer(4096..131072): restrict max send pdu tonbytes π€--repeatβ[n]umber: integer: repeatntimes π--abortβ abort association instead of releasing it π-nh,--no-haltβ do not halt if unsuccessful store encountered (default: do halt) π-up,--uid-paddingβ silently correct space-padded UIDs π€«+II,--invent-instanceβ invent a new SOP instance UID for every image sent πͺ+IR,--invent-seriesβ[n]umber: integer(implies--invent-instance): invent a new series UID afternimages have been sent (default:100) π+IS,--invent-studyβ[n]umber: integer(implies--invent-instance): invent a new study UID afternseries have been sent (default:50) π+IP,--invent-patientβ[n]umber: integer(implies--invent-instance): invent a new patient ID and name afternstudies have been sent (default:25) π§ββοΈ
π transport layer security (TLS) options π
transport protocol stack:
-tls,--disable-tlsβ use normal TCP/IP connection (default) π+tls,--enable-tlsβ[p]rivate key file, [c]ertificate file: string: use authenticated secure TLS connection π+tla,--anonymous-tlsβ use secure TLS connection without certificate π΅οΈ
private key password (only with --enable-tls):
+ps,--std-passwdβ prompt user to type password on stdin (default) β¨οΈ+pw,--use-passwdβ[p]assword: string: use specified password π-pw,--null-passwdβ use empty string as password π«
key and certificate file format:
-pem,--pem-keysβ read keys and certificates as PEM file (default) π-der,--der-keysβ read keys and certificates as DER file π§Ύ
certification authority:
+cf,--add-cert-fileβ[f]ilename: string: add certificate file to list of certificates β+cd,--add-cert-dirβ[d]irectory: string: add certificates indto list of certificates π+crl,--add-crl-fileβ[f]ilename: string: add certificate revocation list file (implies--enable-crl-vfy) π«+crv,--enable-crl-vfyβ enable leaf CRL verification π+cra,--enable-crl-allβ enable full chain CRL verification βοΈ
security profile:
+ph,--list-profilesβ list supported TLS profiles and exit π+pg,--profile-8996β BCP 195 RFC 8996 TLS Profile (default) π+pm,--profile-8996-modβ Modified BCP 195 RFC 8996 TLS Profile π οΈ
Page note: # only available if underlying TLS library supports all TLS features required for this profile β read the room, bestie π
+py,--profile-bcp195-ndβ Non-downgrading BCP 195 TLS Profile (retired) π΅+px,--profile-bcp195β BCP 195 TLS Profile (retired) π΅+pz,--profile-bcp195-exβ Extended BCP 195 TLS Profile (retired) π΅+pb,--profile-basicβ Basic TLS Secure Transport Connection Profile (retired) π΅
Page note: # only available if underlying TLS library supports 3DES β vintage behavior, handle with care π
+pa,--profile-aesβ AES TLS Secure Transport Connection Profile (retired) π΅+pn,--profile-nullβ Authenticated unencrypted communication (retired, was used in IHE ATNA) π΅
π ciphersuite:
+cc,--list-ciphersβ prints out all the TLS ciphersuites we support and then bounces (exits). cute little info-dump, no connection made π+cs,--cipher[c]iphersuite name: string β adds a ciphersuite to the list of suites up for negotiation. yes bestie you can stack these π
π¦ server name indication π¦
--no-sniβ do not use SNI. this is the default, no cap π--request-sni[s]erver name: string β requests server name s. go ahead, name-drop the server β¨
π pseudo random generator π
+rs,--seed[f]ilename: string β seeds the random generator with the contents of file f π±+ws,--write-seedβ writes the modified seed back out (only valid together with--seed) πΎ+wf,--write-seed-file[f]ilename: string β writes the modified seed to file f (also only with--seed) π
π peer authentication π
-rc,--require-peer-certβ verifies the peer certificate and fails if it's absent. this is the default, she does not play π€-ic,--ignore-peer-certβ doesn't verify the peer certificate at all. living dangerously, love that for you π
π NOTES π
π Scanning Directories π
okay so real talk: adding directories as a parameter on the command line only makes sense if you also pass --scan-directories. like, that's the whole deal π«Ά
And if the files inside those directories should be picked based on a specific name pattern (e.g. using wildcard matching), you gotta use --scan-pattern. important detail bestie: that file pattern only applies to files within the scanned directories. and if any other patterns are specified on the command line outside the --scan-pattern option (say, to select further files), those patterns do not apply to the directories you specified. iykyk β¨
π§ DICOM Conformance π§
storescu supports the following Storage SOP Classes as an SCU (look at this list, she ate):
ComputedRadiographyImageStorage 1.2.840.10008.5.1.4.1.1.1
DigitalXRayImageStorageForPresentation 1.2.840.10008.5.1.4.1.1.1.1
DigitalXRayImageStorageForProcessing 1.2.840.10008.5.1.4.1.1.1.1.1
DigitalMammographyXRayImageStorageForPresentation 1.2.840.10008.5.1.4.1.1.1.2
DigitalMammographyXRayImageStorageForProcessing 1.2.840.10008.5.1.4.1.1.1.2.1
DigitalIntraOralXRayImageStorageForPresentation 1.2.840.10008.5.1.4.1.1.1.3
DigitalIntraOralXRayImageStorageForProcessing 1.2.840.10008.5.1.4.1.1.1.3.1
CTImageStorage 1.2.840.10008.5.1.4.1.1.2
EnhancedCTImageStorage 1.2.840.10008.5.1.4.1.1.2.1
UltrasoundMultiframeImageStorage 1.2.840.10008.5.1.4.1.1.3.1
MRImageStorage 1.2.840.10008.5.1.4.1.1.4
EnhancedMRImageStorage 1.2.840.10008.5.1.4.1.1.4.1
MRSpectroscopyStorage 1.2.840.10008.5.1.4.1.1.4.2
UltrasoundImageStorage 1.2.840.10008.5.1.4.1.1.6.1
SecondaryCaptureImageStorage 1.2.840.10008.5.1.4.1.1.7
MultiframeSingleBitSecondaryCaptureImageStorage 1.2.840.10008.5.1.4.1.1.7.1
MultiframeGrayscaleByteSecondaryCaptureImageStorage 1.2.840.10008.5.1.4.1.1.7.2
MultiframeGrayscaleWordSecondaryCaptureImageStorage 1.2.840.10008.5.1.4.1.1.7.3
MultiframeTrueColorSecondaryCaptureImageStorage 1.2.840.10008.5.1.4.1.1.7.4
TwelveLeadECGWaveformStorage 1.2.840.10008.5.1.4.1.1.9.1.1
GeneralECGWaveformStorage 1.2.840.10008.5.1.4.1.1.9.1.2
AmbulatoryECGWaveformStorage 1.2.840.10008.5.1.4.1.1.9.1.3
HemodynamicWaveformStorage 1.2.840.10008.5.1.4.1.1.9.2.1
CardiacElectrophysiologyWaveformStorage 1.2.840.10008.5.1.4.1.1.9.3.1
BasicVoiceAudioWaveformStorage 1.2.840.10008.5.1.4.1.1.9.4.1
GrayscaleSoftcopyPresentationStateStorage 1.2.840.10008.5.1.4.1.1.11.1
ColorSoftcopyPresentationStateStorage 1.2.840.10008.5.1.4.1.1.11.2
PseudoColorSoftcopyPresentationStateStorage 1.2.840.10008.5.1.4.1.1.11.3
BlendingSoftcopyPresentationStateStorage 1.2.840.10008.5.1.4.1.1.11.4
XRayAngiographicImageStorage 1.2.840.10008.5.1.4.1.1.12.1
EnhancedXAImageStorage 1.2.840.10008.5.1.4.1.1.12.1.1
XRayRadiofluoroscopicImageStorage 1.2.840.10008.5.1.4.1.1.12.2
EnhancedXRFImageStorage 1.2.840.10008.5.1.4.1.1.12.2.1
NuclearMedicineImageStorage 1.2.840.10008.5.1.4.1.1.20
RawDataStorage 1.2.840.10008.5.1.4.1.1.66
SpatialRegistrationStorage 1.2.840.10008.5.1.4.1.1.66.1
SpatialFiducialsStorage 1.2.840.10008.5.1.4.1.1.66.2
RealWorldValueMappingStorage 1.2.840.10008.5.1.4.1.1.67
VLEndoscopicImageStorage 1.2.840.10008.5.1.4.1.1.77.1.1
VLMicroscopicImageStorage 1.2.840.10008.5.1.4.1.1.77.1.2
VLSlideCoordinatesMicroscopicImageStorage 1.2.840.10008.5.1.4.1.1.77.1.3
VLPhotographicImageStorage 1.2.840.10008.5.1.4.1.1.77.1.4
OphthalmicPhotography8BitImageStorage 1.2.840.10008.5.1.4.1.1.77.1.5.1
OphthalmicPhotography16BitImageStorage 1.2.840.10008.5.1.4.1.1.77.1.5.2
StereometricRelationshipStorage 1.2.840.10008.5.1.4.1.1.77.1.5.3
OphthalmicTomographyImageStorage 1.2.840.10008.5.1.4.1.1.77.1.5.4
BasicTextSRStorage 1.2.840.10008.5.1.4.1.1.88.11
EnhancedSRStorage 1.2.840.10008.5.1.4.1.1.88.22
ComprehensiveSRStorage 1.2.840.10008.5.1.4.1.1.88.33
ProcedureLogStorage 1.2.840.10008.5.1.4.1.1.88.40
MammographyCADSRStorage 1.2.840.10008.5.1.4.1.1.88.50
KeyObjectSelectionDocumentStorage 1.2.840.10008.5.1.4.1.1.88.59
ChestCADSRStorage 1.2.840.10008.5.1.4.1.1.88.65
XRayRadiationDoseSRStorage 1.2.840.10008.5.1.4.1.1.88.67
ColonCADSRStorage 1.2.840.10008.5.1.4.1.1.88.69
EncapsulatedPDFStorage 1.2.840.10008.5.1.4.1.1.104.1
PositronEmissionTomographyImageStorage 1.2.840.10008.5.1.4.1.1.128
RTImageStorage 1.2.840.10008.5.1.4.1.1.481.1
RTDoseStorage 1.2.840.10008.5.1.4.1.1.481.2
RTStructureSetStorage 1.2.840.10008.5.1.4.1.1.481.3
RTBeamsTreatmentRecordStorage 1.2.840.10008.5.1.4.1.1.481.4
RTPlanStorage 1.2.840.10008.5.1.4.1.1.481.5
RTBrachyTreatmentRecordStorage 1.2.840.10008.5.1.4.1.1.481.6
RTTreatmentSummaryRecordStorage 1.2.840.10008.5.1.4.1.1.481.7
β¨ okay now the fun part, the default behavior: storescu proposes two presentation contexts for each supported SOP class (abstract syntax) β one with the preferred transfer syntax, and one with all other uncompressed transfer syntaxes. periodt π
The default preferred transfer syntax is explicit VR with byte ordering corresponding to the local byte ordering of the machine storescu is running on. this behavior can be changed with the --propose, --combine and --required options β see above πΈ
Depending on those options, the following transfer syntaxes are supported:
LittleEndianImplicitTransferSyntax 1.2.840.10008.1.2
LittleEndianExplicitTransferSyntax 1.2.840.10008.1.2.1
DeflatedExplicitVRLittleEndianTransferSyntax 1.2.840.10008.1.2.1.99 (*)
BigEndianExplicitTransferSyntax 1.2.840.10008.1.2.2
JPEGProcess1TransferSyntax 1.2.840.10008.1.2.4.50
JPEGProcess2_4TransferSyntax 1.2.840.10008.1.2.4.51
JPEGProcess14SV1TransferSyntax 1.2.840.10008.1.2.4.70
JPEGLSLosslessTransferSyntax 1.2.840.10008.1.2.4.80
JPEGLSLossyTransferSyntax 1.2.840.10008.1.2.4.81
JPEG2000LosslessOnlyTransferSyntax 1.2.840.10008.1.2.4.90
JPEG2000TransferSyntax 1.2.840.10008.1.2.4.91
MPEG2MainProfileAtMainLevelTransferSyntax 1.2.840.10008.1.2.4.100
MPEG2MainProfileAtHighLevelTransferSyntax 1.2.840.10008.1.2.4.101
MPEG4HighProfileLevel4_1TransferSyntax 1.2.840.10008.1.2.4.102
MPEG4BDcompatibleHighProfileLevel4_1TransferSyntax 1.2.840.10008.1.2.4.103
MPEG4HighProfileLevel4_2_For2DVideoTransferSyntax 1.2.840.10008.1.2.4.104
MPEG4HighProfileLevel4_2_For3DVideoTransferSyntax 1.2.840.10008.1.2.4.105
MPEG4StereoHighProfileLevel4_2TransferSyntax 1.2.840.10008.1.2.4.106
HEVCMainProfileLevel5_1TransferSyntax 1.2.840.10008.1.2.4.107
HEVCMain10ProfileLevel5_1TransferSyntax 1.2.840.10008.1.2.4.108
RLELosslessTransferSyntax 1.2.840.10008.1.2.5
(*)only available if compiled with zlib support enabled (peep the--versionoutput to check) π«Ά
Additional Storage SOP Classes and transfer syntaxes can be used with the so-called "association negotiation profiles" (see below) π
One more thing bestie: storescu does not support extended negotiation by default. However, using an appropriate association negotiation profile (again, see below) the optional support for extended negotiation can be added to particular SOP classes. slay π
πΈ Association Negotiation Profiles and Configuration Files πΈ
storescu supports a flexible mechanism for specifying the DICOM network association negotiation behavior, based on so-called "association negotiation profiles" which may be read from a configuration file. The format and semantics of this configuration file are documented in asconfig.txt. go read it, it's giving lore π
π User Identity Negotiation π
When specifying user name and/or password using options --user and -e --password, the value has to be provided in UTF-8 encoding. no exceptions, bestie π₯
If the option --pos-response is used, the SCP is asked to explicitly respond β i.e. acknowledge β the user credentials provided in the storescu request. Otherwise, if no such response is sent, storescu will not continue, and instead aborts the connection π
Since User Identity Negotiation is an optional feature that was introduced later into the standard, many SCPs will not check the user identity provided and therefore will not provide a user identity response at all. so like... don't be shocked when it ghosts you π
π« LOGGING π«
Okay bestie, so the level of logging output from the various command line tools and the underlying libraries? Yeah, you can set that yourself. By default, only errors and warnings get written to the standard error stream β very demure, very mindful. π
Hit --verbose and you also get informational messages, like processing details. Slay. Want even more? --debug gives you way more details on the internal activity β like, ideal for debugging purposes. And if you want other logging levels, that's what --log-level is for. π
In --quiet mode, only fatal errors get reported. And ngl, when those very severe error events happen, the application will usually just... terminate. π
Want the full tea on the different logging levels? See the documentation of module "oflog" β it's all there, iykyk.
Now, if you want your logging output written to a file (optionally with logfile rotation), or to syslog (Unix) or the event log (Windows), use the --log-config option. This configuration file also lets you direct only certain messages to a particular output stream, and filter certain messages based on the module or application where they were generated. So picky, so iconic. β¨ An example configuration file is provided in <etcdir>/logger.cfg.
π COMMAND LINE π
All command line tools use this notation for parameters, so memorise the vibe check:
- Square brackets enclose optional values (
0-1). - Three trailing dots mean multiple values are allowed (
1-n). - A combination of both means
0tonvalues.
Command line options are distinguished from parameters by a leading '+' or '-' sign, respectively. Usually the order and position of command line options are arbitrary β like, they can appear anywhere, main character energy. π«Ά
But heads up: if options are mutually exclusive, the rightmost appearance is the one that's used. This behavior conforms to the standard evaluation rules of common Unix shells. Periodt.
Also! You can specify one or more command files using an '@' sign as a prefix to the filename (e.g. @command.txt). Such a command argument gets replaced by the content of the corresponding text file β with multiple whitespaces treated as a single separator unless they appear between two quotation marks β prior to any further evaluation. π
β οΈ Please note that a command file cannot contain another command file. No nesting, bestie, it's not that deep.
This simple but effective approach lets you summarise common combinations of options/parameters and avoids longish and confusing command lines. An example is provided in file <datadir>/dumppat.txt. Literally so convenient. π
π¦ ENVIRONMENT π¦
The storescu utility will attempt to load DICOM data dictionaries specified in the DCMDICTPATH environment variable. By default β like, if the DCMDICTPATH environment variable is not set β the file <datadir>/dicom.dic will be loaded, unless the dictionary is built into the application (default for Windows).
The default behavior should be preferred, and the DCMDICTPATH environment variable only used when alternative data dictionaries are required. The DCMDICTPATH environment variable has the same format as the Unix shell PATH variable, in that a colon (":") separates entries. On Windows systems, a semicolon (";") is used as a separator. πͺ
The data dictionary code will attempt to load each file specified in the DCMDICTPATH environment variable.
π It is an error if no data dictionary can be loaded. Like, actual error. Not a vibe.
π FILES π
<docdir>/asconfig.txtβ configuration file documentation π<etcdir>/storescu.cfgβ example association negotiation profile β¨
π SEE ALSO π
storescp(1) β go say hi to its sibling π«Ά
πΈ COPYRIGHT πΈ
Copyright (C) 1996-2026 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany.
And that's the whole page, bestie, you ate that π
β¨ This was storescu(1), Version 3.7.1, dated Sat Oct 17 2026 09:34:01 β go forth and negotiate those associations, icon πππ
π¦ where this page comes from
- arch rolling: dcmtk 3.7.1-1 Β· BSD-3-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms