Association Rejection
Symptom**: SCU receives A-ASSOCIATE-RJ during connect, no DIMSE commands ever flow.
Common causes**:
- Wrong Called AE Title. The server checks the Called AE Title and rejects mismatches. Verify with the remote admin — the default AE title
ANY-SCP is rarely valid in production.
- Wrong Calling AE Title. Many servers maintain an allowlist of known peers. Ask the remote to register your Calling AE Title.
- No matching presentation contexts. The SCU proposed SOP classes or transfer syntaxes the SCP doesn't accept. Use
dcmtk's echoscu -v or our echo_scu --verbose to see the negotiation details.
- TLS mismatch. If one side requires TLS and the other doesn't, you see a connection abort before DICOM-level association. Check TLS config on both ends.
Transfer Syntax Mismatch
Symptom**: dcm_info shows one transfer syntax, but C-STORE fails with "no matching presentation context".
Cause**: The SCU proposed the file's actual transfer syntax, but the SCP only accepts a different one.
Fix**: Convert the file first with dcm_conv --to explicit_vr_le input.dcm converted.dcm, then send. Or configure the SCP to accept the original syntax.
Incomplete DICOM Files
Symptom**: dcm_info reports "unexpected end of file" or "invalid tag".
Causes**:
- Transfer was aborted mid-stream and the file is truncated. Compare file size with the expected size.
- Missing File Meta Information header. Part 10 files must start with a 128-byte preamble followed by "DICM" magic. Files without it aren't valid Part 10.
- Implicit-VR data being read as Explicit-VR. The transfer syntax in the File Meta header determines how the dataset is parsed. If the header lies about the syntax, parsing fails.
Use dcm_dump --raw to inspect the first few tags without full parsing.
Network Connectivity
Symptom**: echo_scu times out or connection refused.
Checks**:
telnet <host> <port> — does the port even respond? If not, firewall or routing.
- Is the server actually listening?
netstat -an | grep <port> on the server.
- Are you hitting the right port? DICOM commonly uses 104 (privileged) or 11112 (unprivileged).
- Is there a reverse proxy stripping DICOM traffic? Some SSL terminators corrupt DIMSE.
- On macOS, the firewall prompts for incoming connections on new listeners — click Allow.
Storage Commitment Failures
Symptom**: Storage Commitment N-ACTION returns, but the subsequent N-EVENT-REPORT never arrives or reports failure.
Causes**:
- The destination AE for N-EVENT-REPORT is unreachable. The SCP tries to push the result back and fails silently.
- The SOP instances were never fully persisted before the commitment query ran.
- The SCU and SCP disagree on the list of objects being committed — ensure SOP instance UIDs match byte-for-byte.
Build Issues
Symptom**: "ICU not found" or "SQLite not found" during CMake configuration.
Fix**: pacs_system requires ICU for charset encoding and SQLite3 ≥ 3.45.1 for the storage index. Install via your package manager:
# Ubuntu/Debian
sudo apt install libicu-dev libsqlite3-dev
# macOS
brew install icu4c sqlite3
# vcpkg
vcpkg install icu sqlite3
Windows builds should use the vcpkg preset to ensure ICU and SQLite are available.