| 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 |
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? */ | |
!= ex_prim) { | ||
/* did we get a | control part */ | |
if(ctrl_buf.len) | { |
|
/* yup; | is it an ERROR_ACK? */ |
Appendix A | 157 |