Solstice X.25 9.2 Developer's Guide

3.2 Receiving Data

In the same way as sending data, data reception is straightforward. When data is received with the D-bit set, action may be required by the application. When the initial Call Request is sent, it may request that data confirmation be at the application-to-application level. If application-to-application confirmation is agreed upon, then on receiving a packet with the D-bit set, an application must send a Data Acknowledgment (N_DAck) message.

This example prints out incoming data as a string, if the Q-bit is not set:

S_X25_HDR *hdrptr;
 struct xdataf *dat_msg;
 struct xdatacf *dack;
 for(;;) {
 	if (getmsg(x25_fd, &ctlblk, &datblk, &getflags) < 0) {
 		perror("Getmsg fail");
 		exit(1);
 		}
 hdrptr = (S_X25_HDR *) ctlbuf;
 if (hdrptr->xl_type == XL_CTL) {
 /* Deal with protocol message as required - 
  * see below
  */
 	}
 if (hdrptr->xl_type == XL_DAT) {
 	dat_msg = (struct xdataf *) ctlbuf;
 	switch (dat_msg->xl_command) {
 		case N_Data: 
 			if (dat_msg->More)
 				printf("M-bit set \n");
 			if (dat_msg->setQbit)
 				printf("Q-bit set \n");
 			else  {
 				if (dat_msg->setDbit) 
 					printf("D-bit set \n");
 				for (i = 1;i<datblk.len; i++) 
 					printf("%c", datbuf[i]);
 /* 
  * If application to application 
  * Dbit confirmation was negotiated 
  * at call setup time,
  * send an N_DAck 
  */
 				if (app_to_app && dat_msg->setDbit) { 
 					dack = (struct xdatacf *)malloc(sizeof(struct xdatacf));
 					memset((char *)dack 0, sizeof(struct xdatacf)); 
 					dack- >xl_command = N_DAck; 
 					dack->xl_type = XL_DAT; 
 					ctlblk->len = sizeof(struct xdatacf); 
 					ctlblk->buf = (char *)dack;  
 					datblk->len = 0;
 					datblk->buf = (char *)0; 
 					putmsg(x25_fd, &ctlblk, &datblk, &getflags);
 					} 
 				} /* end else */
 			break;
 		case N_EData: 
 			printf("***Expedited data received \n");
 /* Must deal with it */
 			break;
 		case N_DAck: 
 			printf("***Data Acknowledgment received \n");
 			break;
 		default: 
 			break;
 		} /* end switch */
 	} /* end if */
 } /* end for */