Sample Programs

 

Connectionless Mode

AREA_SIZE,

/* maxlen = AREA_SIZE */

0,

/* len gets filled in for each message */

data_area

/* buf = data area */

};

 

/************************************************************************** get the next message from a stream; get_msg() returns one of the following defines

**************************************************************************/

#define GOT_CTRL

1

/* message has only a control part */

#define GOT_DATA

2

/*

message has only a data part */

#define GOT_BOTH

3

/*

message has both control and data parts */

int

 

 

get_msg(fd)

 

 

int

fd;

/* file descriptor */

{

 

 

int

flags = 0;

/* 0 ---> get any available message */

int

result = 0;

/* return value */

/*

zero first byte of control area so the caller can call check_ctrl without checking the get_msg return value; if there was only data in the message and the user was expecting control or control + data, then when he calls check_ctrl it will compare the expected primitive zero and print information about the primitive that it got.

*/

ctrl_area[0] = 0;

/* call getmsg and check for an error */ if(getmsg(fd, &ctrl_buf, &data_buf, &flags) < 0) {

printf(”error: getmsg failed, errno = %d\n”, errno); exit(1);

}

if(ctrl_buf.len > 0) { result = GOT_CTRL;

}

if(data_buf.len > 0) { result = GOT_DATA;

}

return(result);

}

/************************************************************************** check that control message is the expected message

**************************************************************************/

void

 

 

check_ctrl(ex_prim)

 

int

ex_prim;

/* the expected primitive */

{

 

 

dl_error_ack_t

*err_ack = (dl_error_ack_t *)ctrl_area;

/* did we get the expected

primitive? */

if(err_ack->dl_primitive

!= ex_prim) {

/* did we get a

control part */

if(ctrl_buf.len)

{

 

/* yup;

is it an ERROR_ACK? */

Appendix A

157

Page 157
Image 157
HP UX 11i v2 Networking Software manual Appendix a 157