clntudp_create Subroutine

Important: The subroutine is exported from both the libc and the libnsl libraries.

clntudp_create Subroutine Exported from the libc Library

Purpose

Creates a User Datagram Protocol/Internet Protocol (UDP/IP) client transport handle.

Library

C Library (libc.a)

Syntax

#include <rpc/rpc.h>

CLIENT *clntudp_create (addr, prognum, versnum, wait, sockp)
struct sockaddr_in * addr;
u_long  prognum,  versnum;
struct timeval  wait;
int * sockp;

Description

The clntudp_create subroutine creates a Remote Procedure Call (RPC) client transport handle for a remote program. The client uses UDP as the transport to pass messages to the service.

RPC messages transported by UDP/IP can hold up to 8KB of encoded data. Use this subroutine for procedures that take arguments or return results of less than 8KB.

Parameters

Item Description
addr Points to the Internet address of the remote program. If the port number for this Internet address (addr->sin_port) is 0, then the value of the addr parameter is set to the port that the remote program is listening on. The clntudp_create subroutine consults the remote portmap daemon for this information.
prognum Specifies the program number of the remote program.
versnum Specifies the version number of the remote program.
wait Sets the amount of time that the UDP/IP transport waits to receive a response before the transport sends another remote procedure call or the remote procedure call times out. The total time for the call to time out is set by the clnt_call macro.
sockp Specifies a pointer to a socket. If the value of the sockp parameter is RPC_ANYSOCK, the clntudp_create subroutine opens a new socket and sets the sockp pointer to that new socket.

Return Values

Upon successful completion, this subroutine returns a valid UDP client handle. If unsuccessful, it returns a value of null.

clntudp_create Subroutine Exported from the libnsl Library

Purpose

Creates a User Datagram Protocol/Internet Protocol (UDP/IP) client transport handle.

Library

Network Services Library (libnsl.a)

Syntax

#include <rpc/rpc.h>
CLIENT *clntudp_bufcreate (addr, prognum, versnum, wait, fdp)
struct sockaddr_in *addr;
rpcprog_t prognum;
rpcvers_t versnum;
struct timeval wait;
int *fdp;

Description

The clntudp_create subroutine creates a Remote Procedure Call (RPC) client transport handle for a remote program. The client uses UDP as the transport to pass messages to the service.

RPC messages transported by UDP/IP can hold up to 8KB of encoded data. Use this subroutine for procedures that take arguments or return results of less than 8KB.

Parameters

Item Description
addr Points to the Internet address of the remote program. If the port number for this Internet address (addr->sin_port) is 0, then the value of the addr parameter is set to the port that the remote program is listening on. The clntudp_create subroutine consults the remote portmap daemon for this information.
prognum Specifies the program number of the remote program.
versnum Specifies the version number of the remote program.
wait Sets the amount of time that the UDP/IP transport waits to receive a response before the transport sends another remote procedure call or the remote procedure call times out. The total time for the call to time out is set by the clnt_call macro.
fdp Specifies a pointer to a socket. If the value of the fdp parameter is RPC_ANYSOCK, the clnttcp_create subroutine opens a new socket and sets the fdp pointer to the new socket.

Return Values

Item Description
a valid UDP client handle successful
a null value unsuccessful

Error Codes

Item Description
RPC_PROGNOTREGISTERED The program is not registered.
RPC_SYSTEMERROR The file descriptor is not valid.

Examples

In the following example, the clntudp_create subroutine creates and returns a UDP/IP client transport handle.

#include <rpc/rpc.h>
#include <stdio.h>

#define ADDRBUFSIZE 255
#define ADDRBUFSIZE 255

int main()
{
  CLIENT *clnt;
  rpcprog_tPROGNUM = 0x3fffffffL;
  rpcvers_tPROGVER = 0x1L;
  intfd;
  struct timeval waittime = {25,0};
  struct sockaddr_in addr;
  char     addrbuf[ADDRBUFSIZE];
  struct netbuf   svcaddr;
  struct netconfig *nconf;
  char host[255] ; /* The remote host name */

  svcaddr.len = 0;
  svcaddr.maxlen = ADDRBUFSIZE;
  svcaddr.buf = addrbuf;
  /* Get pointer to struct netconfig for tcp transport */
  nconf = getnetconfigent("udp");
  if (nconf == (struct netconfig *) NULL) {
    printf("getnetconfigent() failed\n");
    exit(1);
  }
  /* Get the address of remote service */
  if (!rpcb_getaddr(PROGNUM, PROGVER, nconf, &svcaddr, host)) {
    printf("rpcb_getaddr() failed\n");
    exit(1);
  }
  memcpy(&addr, svcaddr.buf, sizeof(struct sockaddr_in));
  fd = ... /*Code to obtain open and bound file descriptor on udp transport */

  clnt = (CLIENT *) clntudp_create(&addr, PROGNUM, PROGVER, waittime, &fd);
  /*
   * Make a call to clnt_call() subroutine
   */
  /* Destroy the client handle in the end */
  clnt_destroy(clnt);

  return 0;
}