Ports and Name Servers

Ports are the low-level communication channels that transmit and receive the raw data between threads and processes. Ports can be assigned names and advertised to other processes through port name servers. Each type of port has its own port name server.

NSPorts and Subclasses

An NSPort object represents a communication channel to or from another NSPort object, which typically resides in a different thread or task. The distributed objects system uses NSPort objects to send NSPortMessage objects back and forth. You should implement interapplication communication using distributed objects whenever possible, and use NSPort objects directly only when necessary.

To receive incoming messages, NSPort objects must be added to an NSRunLoop as an input source. NSConnection objects automatically add their receive port when initialized. See Run Loops for more information.

Subclasses of NSPort represent particular flavors of data transport from one process to another. The available subclasses are NSMachPort, NSMessagePort, and NSSocketPort and each is described below.

Note that instances of port subclasses cannot be mixed on a particular communication channel. For example, a client cannot connect to a server using NSMessagePort if the server only supports connections made with NSSocketPort. Also, you cannot transfer instances of NSMessagePort in a message to another process over a channel which is using NSSocketPort objects as its endpoints; you can only pass NSSocketPort objects on such a channel. These restrictions apply to any subclasses of NSPort, not just NSMessagePort and NSSocketPort. However, you are free to create other connections to a server using other subclasses of NSPort (assuming the server supports multiple transports) and send instances of that other subclass on that channel.

NSMachPort

NSMachPort is an object wrapper for a Mach port, the fundamental communication port in OS X. NSMachPort allows for local (on the same machine) communication only.

To use NSMachPort effectively you should be familiar with Mach ports, port access rights, and Mach messages. See the Mach OS documentation for more information.

NSMessagePort

NSMessagePort is a system-independent implementation of NSPort for sending messages. NSMessagePort allows for local (on the same machine) communication only.

NSSocketPort

NSSocketPort is a system-independent implementation of NSPort for sending messages over a BSD socket port. NSSocketPort allows for both local and remote communication, but may be more expensive than the other ports for the local case.

NSPortNameServer and Subclasses

NSPortNameServer provides an object-oriented interface to the port registration service used by the distributed objects system. NSConnection objects use it to contact each other and to distribute objects over the network; you should rarely need to interact directly with an NSPortNameServer object .

You get an NSPortNameServer object by using the systemDefaultPortNameServer class method—never allocate and initialize an instance directly. With the default server object you can register an NSPort object under a given name, making it available on the network, and also unregister it so that it cannot be looked up (although other applications that have already looked up the NSPort object can still use it until it becomes invalid).

Each type of NSPort has its own NSPortNameServer subclass as described below.

NSMachBootstrapServer

This port name server takes and returns instances of NSMachPort.

Port removal functionality is not supported in NSMachBootstrapServer; if you want to cancel a service, you have to destroy the port (invalidate the NSMachPort object given to registerPort:name:).

NSMessagePortNameServer

This port name server takes and returns instances of NSMessagePort.

Port removal functionality is not supported in NSMessagePortNameServer; if you want to cancel a service, you have to destroy the port (invalidate the NSMessagePort object given to registerPort:name:).

NSSocketPortNameServer

This port name server takes and returns instances of NSSocketPort.

Port removal functionality is supported by the removePortForName: method and should be used to remove invalid socket ports.

Unlike the other port name servers, NSSocketPortNameServer can operate over a network. By registering your socket ports, you make them available to other computers on the network without hard-coding the TCP port numbers. Clients just need to know the name of the host running the port name server (and the name of the port).