Listing 2. streamcount_echo_client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.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: astreamcount_echo_client ip-addr istreams
  ostreams";

char *msg = "hello";

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

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

        if (argc != 4) usage();

        /* create endpoint */
        sockfd = socket(AF_INET, SOCK_STREAM,
                        IPPROTO_SCTP
                );

        if (sockfd < 0) {
                perror("socket creation");
                exit(2); }
        /* connect to server */
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
        serv_addr.sin_port = htons(port);

        memset(&initmsg, 0, sizeof(initmsg));
        initmsg.sinit_max_instreams = atoi(argv[2]);
        initmsg.sinit_num_ostreams = atoi(argv[3]);
        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");
        }

        if (connect(sockfd, (struct sockaddr *) &serv_addr,
                    sizeof(serv_addr)) < 0) {
                perror("connectx");
                exit(3);
        }

        len = sizeof(status);
        memset(&status, 0, len);

        if (getsockopt(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 server time to do something */
        sleep(2);

        /* no reads/writes are done */
        close(sockfd);
        exit(0);
}

