int main() { int lfd, cfd; struct sctp_event_subscribe events; struct sctp_initmsg init; struct sockaddr_in sin[1]; if((lfd = ext_socket(checkIPv6() ? AF_INET6 : AF_INET, SOCK_STREAM, IPPROTO_SCTP)) == -1) { perror("socket"); exit(1); } init.sinit_num_ostreams = MAX_OUTGOING; init.sinit_max_instreams = MAX_INCOMING; init.sinit_max_attempts = 3; init.sinit_max_init_timeo = 30; if(ext_setsockopt(lfd, IPPROTO_SCTP, SCTP_INITMSG, (void*)&init, sizeof(init)) < 0) { perror("setsockopt"); exit(1); } sin->sin_family = AF_INET; sin->sin_port = htons(7); sin->sin_addr.s_addr = INADDR_ANY; if(ext_bind(lfd, (struct sockaddr *)sin, sizeof (*sin)) == -1) { perror("bind"); exit(1); } /* Enable ancillary data and notifications */ memset((char*)&events,1,sizeof(events)); if (ext_setsockopt(lfd, IPPROTO_SCTP, SCTP_EVENTS, &events, sizeof(events)) < 0) { perror("setsockopt SCTP_EVENTS"); exit(1); } if(ext_listen(lfd, 1) == -1) { perror("listen"); exit(1); } /* Wait for new associations */ for (;;) { if((cfd = ext_accept(lfd, NULL, 0)) == -1) { perror("accept"); exit(1); } /* Enable ancillary data and notifications */ memset((char*)&events,1,sizeof(events)); if(ext_setsockopt(cfd, IPPROTO_SCTP, SCTP_EVENTS, &events, sizeof(events)) < 0) { perror("setsockopt SCTP_EVENTS"); exit(1); } /* Echo back any and all data */ echo(cfd,0); } }
static void* start_server(void *arg) { pthread_t tid; int *fdp; struct sockaddr_in remote_addr; int remote_addr_len; struct server_data data; data = *((struct server_data *) arg); free(arg); bzero(&remote_addr, sizeof(remote_addr)); remote_addr_len = sizeof(remote_addr); for(;;){ fdp = malloc(sizeof(int)); if((*fdp=ext_accept(data.fd, (struct sockaddr *) &remote_addr, &remote_addr_len)) < 0) perror("accept call failed"); if (verbose) { printf("%-6d: Connection accepted from %s:%u.\n", *fdp, inet_ntoa(remote_addr.sin_addr), ntohs(remote_addr.sin_port)); fflush(stdout); } pthread_create(&tid, NULL, data.connection_handler, fdp); } return(NULL); }