Previous | Table of Contents | Next |
Agents that are capable of accepting object requests or providing locations for objects
(i.e., servers) publish TCP/IP addresses in IORs, as described in Section 15.7.2, “IIOP
IOR Profiles,? on page 15-52. A TCP/IP address consists of an IP host address,
typically represented by a host name, and a TCP port number. Servers must listen for connection requests.
A client needing an object’s services must initiate a connection with the address specified in the IOR, with a connect request.
The listening server may accept or reject the connection. In general, servers should accept connection requests if possible,
but ORBs are free to establish any desired policy for connection acceptance (e.g., to enforce fairness or optimize resource
usage).
Once a connection is accepted, the client may send Request, LocateRequest, or CancelRequest messages by writing to the TCP/IP
socket it owns for the connection. The server may send Reply, LocateReply, and CloseConnection messages by writing to its
TCP/IP connection. In GIOP 1.2, and 1.3, the client may send the CloseConnection message, and if BiDirectional GIOP is in
use, the client may also send Reply and LocateReply messages.
After receiving a CloseConnection message, an ORB must close the TCP/IP connection. After sending a CloseConnection, an ORB
may close the TCP/IP connection immediately, or may delay closing the connection until it receives an indication that the
other side has closed the connection. For maximum interoperability with ORBs using TCP implementations that do not properly
implement orderly shutdown, an ORB may wish to only shutdown the sending side of the connection, and then read any incoming
data until it receives an indication that the other side has also shutdown, at which point the TCP connection can be closed
completely.
Given TCP/IP’s flow control mechanism, it is possible to create deadlock situations between clients and servers if both sides
of a connection send large amounts of data on a connection (or two different connections between the same processes) and do
not read incoming data. Both processes may block on write operations, and never resume. It is the responsibility of both clients
and servers to avoid creating deadlock by reading incoming messages and avoiding blocking when writing messages, by providing
separate threads for reading and writing, or any other workable approach. ORBs are free to adopt any desired implementation
strategy, but should provide robust behavior.