− | Ports are globally accessible points exposed by the server using CreatePort. Clients can start IPC sessions by connect to a server through a port using ConnectToPort. On the client-side, a port is identified by a fixed string, while on the server-side it is represented by a kernel handle using which the server can wait for incoming connections (using svcWaitSynchronization on that handle). | + | Ports are IPC interfaces exposed by the server using CreatePort. Clients can start IPC sessions by connecting to a server through a port using ConnectToPort. On the client-side, a port is identified by a fixed string, while on the server-side it is represented by a kernel handle using which the server can wait for incoming connections (using svcWaitSynchronization on that handle). "Anonymous" ports can be created by not providing a port name to the kernel during creation. In this case, it is not possible to create a session through ConnectToPort - sessions can only be created if one has a handle to the port itself. |
− | Services are anonymous ports: They can not be connected to through ConnectToPort because they don't have any name recognized by that function. Instead, a service is registered to the [[Services|service manager]] port ("srv:") using the IPC command RegisterService. Clients then open sessions to services using the service manager command GetServiceHandle. | + | Services are an abstraction of ports that can not be connected to through ConnectToPort, as the underlying port is an anonymous port created by [[Services|service manager]]. Clients are instead expected to open a session using the service manager ("srv:") port command GetServiceHandle. A service is registered with service manager using the command RegisterService. |