The local management requirements of the example client and server are used to discuss details of these facilities. Example 3-3 shows the definitions needed by the client program, followed by its necessary local management steps.
#include <stdio.h> #include <tiuser.h> #include <fcntl.h> #define SRV_ADDR 1 /* server's address */ main() { int fd; int nbytes; int flags = 0; char buf[1024]; struct t_call *sndcall; extern int t_errno; if ((fd = t_open("/dev/exmp", O_RDWR, (struct t_info *),NULL)) == -1) { t_error("t_open failed"); exit(1); } if (t_bind(fd, (struct t_bind *) NULL, (struct t_bind *) NULL) == -1) { t_error("t_bind failed"); exit(2); } |
The first argument of t_open() is the path of a file system object that identifies the transport protocol. /dev/exmp is the example name of a special file that identifies a generic, connection-based transport protocol. The second argument, O_RDWR, specifies to open for both reading and writing. The third argument points to a t_info structure in which to return the service characteristics of the transport.
This data is useful to write protocol-independent software (see "Guidelines to Protocol Independence"). In this example, a NULL pointer is passed. For Example 3-3, the transport provider must have the following characteristics:
The transport address is an integer value that uniquely identifies each user.
The transport provider supports the T_COTS_ORD
service type, since the example uses orderly release.
The transport provider does not require protocol-specific options.
If the user needs a service other than T_COTS_ORD
, another transport provider can be opened. An example of the T_CLTS
service invocation is shown in the section "Read/Write Interface".
t_open() returns the transport endpoint file handle that is used by all subsequent XTI/TLI function calls. The identifier is a file descriptor from opening the transport protocol file. See open(2).
The client then calls t_bind() to assign an address to the endpoint. The first argument of t_bind() is the transport endpoint handle. The second argument points to a t_bind structure that describes the address to bind to the endpoint. The third argument points to a t_bind structure that describes the address that the provider has bound.
The address of a client is rarely important because no other process tries to access it. That is why the second and third arguments to t_bind() are NULL. The second NULL argument directs the transport provider to choose an address for the user.
If t_open() or t_bind() fails, the program calls t_error() to display an appropriate error message via stderr. The global integer t_errno is assigned an error value. A set of error values is defined in tiuser.h.
t_error() is analogous to perror(). If the transport function error is a system error, t_errno() is set to TSYSERR, and errno is set to the appropriate value.