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