SCTP Programmer's Guide

printf("^^^ shutdown event\n");
break;
default:
printf("unknown type: %hu\n", snp->sn_header.sn_type);
break;
}
}
int main(int argc, char **argv)
{
int fd, sz, len, msg_flags;
int idleTime = 20;
struct sockaddr_in sin[1], cli_addr;
struct sctp_event_subscribe event;
char readbuf[100];
struct sctp_sndrcvinfo sri;
if (argc < 2) {
printf ("\nUsage: <%s> <port>\n\n", argv[0]);
return -1;
}
if ((fd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)) == -1) {
perror("socket");
exit(1);
}
sin->sin_family = AF_INET;
sin->sin_port = htons(atoi(argv[1]));
sin->sin_addr.s_addr = INADDR_ANY;
if (bind(fd, (struct sockaddr *)sin, sizeof (*sin)) == -1) {
perror("bind");
exit(1);
}
#if 0
/* Not interested in any events for now */
memset (&event, 0, sizeof(event));
#else
/* Enable all events */
event.sctp_data_io_event = 1;
event.sctp_association_event = 1;
event.sctp_address_event = 1;
event.sctp_send_failure_event = 1;
event.sctp_peer_error_event = 1;
event.sctp_shutdown_event = 1;
event.sctp_partial_delivery_event = 1;
event.sctp_adaption_layer_event = 1;
#endif
if (setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(event)) != 0) {
perror("setevent failed");
exit(1);
}
/* Set associations to auto-close in 20 seconds of
* inactivity
*/
if (setsockopt(fd, IPPROTO_SCTP, SCTP_AUTOCLOSE,
&idleTime, 4) < 0) {
perror("setsockopt SCTP_AUTOCLOSE");
exit(1);
}
/* Allow new associations to be accepted */
Sample Server Programs 79