The bug only appeared when the same process had both TCP and UDP sockets:
every listening port on that process was attributed to whichever protocol
was encountered first. For example, if a process listened on TCP 8000 and
UDP 8001, the UI could wrongly show TCP 8001 as in use while UDP 8001
looked unused.
Use (PID, conn.Type) as the cache key so each protocol has its own
ListeningProcess entry.
* feat: Add endpoint to retrieve listening processes and update related services
* fix: Update listening process retrieval logic to include socket type checks
* refactor: accept context for improved request handling