Listing 2. chat_server.c #include #include #include #include #include #include #include #define SIZE 1024 char buf[SIZE]; #define CHAT_PORT 2013 int main(int argc, char *argv[]) { int sockfd, client_sockfd; int nread, nsent, len; struct sockaddr_in serv_addr, client_addr; struct sctp_sndrcvinfo sinfo; int flags; struct sctp_event_subscribe events; sctp_assoc_t assoc_id; /* create endpoint */ sockfd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP); if (sockfd < 0) { perror(NULL); exit(2); } /* bind address */ serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(CHAT_PORT); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { perror(NULL); exit(3); } bzero(&events, sizeof(events)); events.sctp_data_io_event = 1; if (setsockopt(sockfd, IPPROTO_SCTP, SCTP_EVENTS, &events, sizeof(events))) { perror("set sock opt\n"); } /* specify queue */ listen(sockfd, 5); printf("Listening\n"); for (;;) { len = sizeof(client_addr); nread = sctp_recvmsg(sockfd, buf, SIZE, (struct sockaddr *) &client_addr, &len, &sinfo, &flags); printf("Got a read of %d\n", nread); write(1, buf, nread); /* send it back out to all associations */ bzero(&sinfo, sizeof(sinfo)); sinfo.sinfo_flags |= SCTP_SENDALL; sctp_send(sockfd, buf, nread, // (struct sockaddr *) &client_addr, 1, &sinfo, 0); } }