int server(int argc, char* argv[]) { int sctp_otm_sock = -1, port_otm = -1; // socket and port for one to many sctp int count = 0; char mbuffer[MBUFFERLEN]; // static message buffer struct sockaddr* addresses = NULL; struct sctp_event_subscribe sctp_events; // sctp events struct sctp_sndrcvinfo infodata; // information about sender struct sctp_initmsg sctp_init; // sctp socket option initialization // Add listening for 2 interruption signals signal(SIGTERM, sighandler); signal(SIGINT, sighandler); // not enough or too many parameters if(argc > 3 || argc < 2){ return testserver_input_error((argc == 1) ? argv[0] : NULL); } // Port is not valid if((port_otm = atoi(argv[1])) <= 0x0400 || port_otm > 0xffff){ return testserver_input_error(NULL); } printf("starting server on port:\t%d\n", port_otm); // Socket creation if((sctp_otm_sock = socket(PF_INET6, SOCK_SEQPACKET, IPPROTO_SCTP)) == -1){ return error_situation(); } if(argc == 3) { if(strcasecmp(argv[2], "ifaddrs") == 0){ addresses = get_own_addresses_gia(&count, port_otm, NOLOOPBACK, ONLYRUNNING); }else if(strcasecmp(argv[2], "addrinfo") == 0){ addresses = get_own_addresses_gai(&count, argv[1]); }else if(strcasecmp(argv[2], "combined") == 0){ addresses = get_own_addresses_combined(&count, argv[1], NOLOOPBACK, ONLYRUNNING); }else { printf("Invalid parameter for address search function selection.\n \ \tifaddrs = getifaddrs()\n\taddrinfo = getaddrinfo()\n"); exit(1); } }else{
if(argc == 3) { if(strcasecmp(argv[2],"ifaddrs") == 0) addresses = get_own_addresses_gia(&count,port_otm,NOLOOPBACK,ONLYRUNNING); else if(strcasecmp(argv[2],"addrinfo") == 0) addresses = get_own_addresses_gai(&count,argv[1]); else if(strcasecmp(argv[2],"combined") == 0) addresses = get_own_addresses_combined(&count,argv[1],NOLOOPBACK,ONLYRUNNING); else { printf("Invalid parameter for address search function selection.\n \ \tifaddrs = getifaddrs()\n\taddrinfo = getaddrinfo()\n"); exit(1); } } else addresses = get_own_addresses_gia(&count,port_otm,NOLOOPBACK,ONLYRUNNING); print_packed_addresses(count,(struct sockaddr_storage*)addresses); if(!addresses) printf("No addresses to bind\n"); #ifdef __BINDX_SEPARATELY else { int i = 0, storlen = 0, slen = 0; // Start from the beginning struct sockaddr* temp = addresses; while (i < count) { // We need to know the size slen = (temp->sa_family == AF_INET ?