Listing 2. chat_server.c

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#include <netinet/sctp.h>

#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);

        }
}