Listing 3. streamcount_echo_server.c

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

#include <netinet/sctp.h>

#define ECHO_PORT 2013

char *usage_msg = "usage: streamcount_echo_server istreams ostreams";

void usage() {
        fprintf(stderr, "%s\n", usage_msg);
        exit(1);
}


int main(int argc, char *argv[]) {
        int sockfd, client_sockfd;
        int len;
        struct sockaddr_in serv_addr, client_addr;
        int port = ECHO_PORT;
        struct sctp_initmsg initmsg;
        struct sctp_status status;

        if (argc != 3) usage();

        /* create endpoint */
        sockfd = socket(AF_INET, SOCK_STREAM,
                        IPPROTO_SCTP
                );
        if (sockfd < 0) {
                perror("socket");
                exit(2);
        }

        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        serv_addr.sin_port = htons(port);

        if (bind(sockfd, (struct sockaddr *) &serv_addr,
                 sizeof(serv_addr)) == -1) {
                perror("sctp bind");
                exit(2);
        }


        memset(&initmsg, 0, sizeof(initmsg));
        initmsg.sinit_max_instreams = atoi(argv[1]);
        initmsg.sinit_num_ostreams = atoi(argv[2]);
        printf("Asking for: input streams: %d, output streams: %d\n",
               initmsg.sinit_max_instreams,
               initmsg.sinit_num_ostreams);

        if (setsockopt(sockfd, IPPROTO_SCTP,
                       SCTP_INITMSG, &initmsg, sizeof(initmsg))) {
                perror("set sock opt\n");
        }

        /* specify queue */
        listen(sockfd, 5);
        for (;;) {
                len = sizeof(client_addr);
                client_sockfd = accept(sockfd, (struct sockaddr *)
&client_addr, &len);
                if (client_sockfd == -1) {
                        perror(NULL); continue;
                }

                memset(&status, 0, sizeof(status));
                len = sizeof(status);
                if (getsockopt(client_sockfd, IPPROTO_SCTP,
                               SCTP_STATUS, &status, &len) == -1) {
                        perror("get sock opt");
                }
                printf("Got: input streams: %d, output streams: %d\n",
                       status.sstat_instrms,
                       status.sstat_outstrms);

                /* give the client time to do something */
                sleep(2);
                close(client_sockfd);

        }
}