Listing 2. streamcount_echo_client.c #include #include #include #include #include #include #include #include #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); }