{"id":37080965,"url":"https://github.com/rusty-dicom/dicom-echo","last_synced_at":"2026-01-14T09:49:59.818Z","repository":{"id":255452147,"uuid":"847085027","full_name":"rusty-dicom/dicom-echo","owner":"rusty-dicom","description":"A blazingly fast implementation of the C-ECHO DICOM procedure 🔥","archived":false,"fork":false,"pushed_at":"2025-12-15T20:08:52.000Z","size":1011,"stargazers_count":3,"open_issues_count":22,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-19T03:59:04.405Z","etag":null,"topics":["cli","dicom","python","rust"],"latest_commit_sha":null,"homepage":"https://rusty-dicom.github.io/dicom-echo/dicom_echo.html","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rusty-dicom.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-08-24T20:00:45.000Z","updated_at":"2025-07-25T08:46:42.000Z","dependencies_parsed_at":"2024-10-28T10:34:43.825Z","dependency_job_id":"f99579f7-704c-431d-ad79-487d250bc796","html_url":"https://github.com/rusty-dicom/dicom-echo","commit_stats":null,"previous_names":["rusty-dicom/dicom-echo"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/rusty-dicom/dicom-echo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rusty-dicom%2Fdicom-echo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rusty-dicom%2Fdicom-echo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rusty-dicom%2Fdicom-echo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rusty-dicom%2Fdicom-echo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rusty-dicom","download_url":"https://codeload.github.com/rusty-dicom/dicom-echo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rusty-dicom%2Fdicom-echo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28416120,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T08:38:59.149Z","status":"ssl_error","status_checked_at":"2026-01-14T08:38:43.588Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","dicom","python","rust"],"created_at":"2026-01-14T09:49:58.761Z","updated_at":"2026-01-14T09:49:59.810Z","avatar_url":"https://github.com/rusty-dicom.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DICOM Echo\n\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n[![🎨 poetry (push)](https://github.com/rusty-dicom/dicom-echo/actions/workflows/push-poetry.yaml/badge.svg)](https://github.com/rusty-dicom/dicom-echo/actions/workflows/push-poetry.yaml)\n[![pylint](https://rusty-dicom.github.io/dicom-echo/reports/pylint.svg)](https://rusty-dicom.github.io/dicom-echo/reports/pylint-report.txt)\n[![codecov](https://codecov.io/gh/rusty-dicom/dicom-echo/graph/badge.svg?token=BuC4vpbbD0)](https://codecov.io/gh/rusty-dicom/dicom-echo)\n[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/rusty-dicom/dicom-echo/main.svg)](https://results.pre-commit.ci/latest/github/rusty-dicom/dicom-echo/main)\n[![Checked with mypy](https://www.mypy-lang.org/static/mypy_badge.svg)](https://rusty-dicom.github.io/dicom-echo/reports/mypy-html)\n[![docs: pdoc](https://img.shields.io/badge/docs-pdoc-blueviolet?logo=github)](https://rusty-dicom.github.io/dicom-echo/dicom_echo.html)\n[![readthedocs](https://readthedocs.org/projects/dicom-echo/badge/?version=latest)](https://dicom-echo.readthedocs.io/en/latest/home.html)\n[![PyPI version](https://badge.fury.io/py/dicom-echo.svg)](https://badge.fury.io/py/dicom-echo)\n[![Downloads](https://static.pepy.tech/badge/dicom-echo/month)](https://pepy.tech/project/dicom-echo)\n\nA lightweight, cross-platform, blazingly fast implementation of the `C-ECHO`[^1] DICOM procedure. 🔥\n\nThis package implements a service class user (SCU)[^2] app which functions like a `ping`, testing that the peer service class provider (SCP)[^2] is accepting associations for the given AE titles[^3].\n\nBoth a simple CLI and a Python API are provided for easy integration with your DICOM projects.\n\n## Installation\n\n[`pipx`](https://github.com/pypa/pipx) is recommended to install `dicom-echo` as a standalone CLI utility:\n\n```sh\npipx install dicom-echo\n\n# or if integrating with another Python project:\npip3 install dicom-echo\n```\n\n## CLI Usage\n\nTo send a `C-ECHO` request to `localhost:11111`:\n\n```sh\n❯ dicom-echo localhost:11111\n✅ Success\n\n❯ dicom-echo --help\n```\n\n```\n Usage: dicom-echo [OPTIONS] HOST\n\n Send a `C-ECHO` request to the given address.\n The `C-ECHO` procedure functions like a `ping`, serving to test that the peer SCP is\n accepting associations.\n\n This command will fail if the peer SCP is unreachable or rejects the association request\n for the given AE titles.\n\n Reference: https://www.dicomstandard.org/standards/view/message-exchange#sect_9.1.5\n\n╭─ Arguments ──────────────────────────────────────────────────────────────────────────────╮\n│ *    host      TEXT  The socket address of the peer SCP: {host}:{port}                   │\n│                      Optionally, the AE title may be included: {AE title}@{host}:{port}  │\n│                      [required]                                                          │\n╰──────────────────────────────────────────────────────────────────────────────────────────╯\n╭─ Options ────────────────────────────────────────────────────────────────────────────────╮\n│ --version             -V        display the version of this program                      │\n│ --install-completion            Install completion for the current shell.                │\n│ --show-completion               Show completion for the current shell, to copy it or     │\n│                                 customize the installation.                              │\n│ --help                -h        Show this message and exit.                              │\n╰──────────────────────────────────────────────────────────────────────────────────────────╯\n╭─ DICOM Options ──────────────────────────────────────────────────────────────────────────╮\n│ --called,--called-ae-title    -aec      TEXT     peer AE title of the host SCP           │\n│                                                  [default: ANY-SCP]                      │\n│ --calling,--calling-ae-title  -aet      TEXT     the AE title of this client             │\n│                                                  [default: ECHOSCU]                      │\n│ --id,--message-id             -id       INTEGER  the message ID to send [default: 1]     │\n╰──────────────────────────────────────────────────────────────────────────────────────────╯\n```\n\n## API Usage\n\nThe `dicom_echo` module provides a simple API for sending `C-ECHO` requests:\n\n\u003c!--\n\n```python\n\u003e\u003e\u003e address = getfixture('scpserver')\n\n```\n\n --\u003e\n\n```python\n\u003e\u003e\u003e import dicom_echo as echo\n\n\u003e\u003e\u003e echo.send(address)\n0\n\n```\n\nSee the [API documentation](https://dicom-echo.readthedocs.io/en/latest/) for more details.\n\n[^1]: for additional details, see [9.3.5 `C-ECHO` protocol | DICOM PS3.7 2024c - Message Exchange](https://dicom.nema.org/medical/dicom/current/output/chtml/part07/sect_9.3.5.html#sect_9.3.5.1)\n\n[^2]: [6.7 Service Class Specification | DICOM PS3.4 2024c - Service Class Specifications](https://dicom.nema.org/medical/dicom/current/output/chtml/part04/sect_6.7.html#:~:text=The%20SCU%20or%20user%20agent,are%20determined%20during%20Association%20establishment.) for the definitions of service class user (SCU) and service class provider (SCP):\n\n    \u003e The SCU or user agent acts as the 'client,' while the SCP or origin server acts as the 'server'. For DIMSE based services the SCU/SCP roles are determined during Association establishment\n\n[^3]: [C.1: DICOM Application Entity Titles | DICOM PS3.8 2024c - Network Communication Support for Message Exchange](https://dicom.nema.org/medical/dicom/current/output/chtml/part08/chapter_C.html):\n\n    \u003e A DICOM Application Entity Title uniquely identifies a service or application on a specific system in the network.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frusty-dicom%2Fdicom-echo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frusty-dicom%2Fdicom-echo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frusty-dicom%2Fdicom-echo/lists"}