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); } }
int main(int argc, char **argv) { int fd, n, addr_len, len, msg_flags, close_time, i; size_t buffer_size; fd_set rset; char buffer[1000]; struct sctp_event_subscribe evnts; struct sctp_sndrcvinfo sri; struct sockaddr_in local_addr, remote_addr; struct sctp_setprim set_prim; i = 0; if (argc < 4) { printf("Usage: client2 local_port remote_addr remote_port [autoclose]\n"); exit(-1); } if ((fd = ext_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)) < 0) perror("socket"); bzero(&evnts, sizeof(evnts)); evnts.sctp_data_io_event = 1; evnts.sctp_association_event = 1; evnts.sctp_address_event = 1; evnts.sctp_send_failure_event = 1; evnts.sctp_peer_error_event = 1; evnts.sctp_shutdown_event = 1; evnts.sctp_partial_delivery_event = 1; evnts.sctp_adaption_layer_event = 1; if (ext_setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts)) < 0) perror("setsockopt"); if (argc > 4) { close_time = atoi(argv[4]); if (ext_setsockopt(fd, IPPROTO_SCTP, SCTP_AUTOCLOSE, &close_time, sizeof(close_time)) < 0) perror("setsockopt"); } bzero(&local_addr, sizeof(struct sockaddr_in)); local_addr.sin_family = AF_INET; #ifdef HAVE_SIN_LEN local_addr.sin_len = sizeof(struct sockaddr_in); #endif local_addr.sin_addr.s_addr = htonl(INADDR_ANY); local_addr.sin_port = htons(atoi(argv[1])); if (ext_bind(fd, (struct sockaddr *) &local_addr, sizeof(local_addr)) != 0) perror("bind"); remote_addr.sin_family = AF_INET; remote_addr.sin_port = htons(atoi(argv[3])); #ifdef HAVE_SIN_LEN remote_addr.sin_len = sizeof(struct sockaddr_in); #endif remote_addr.sin_addr.s_addr = inet_addr(argv[2]); FD_ZERO(&rset); while (1) { FD_SET(fd, &rset); FD_SET(0, &rset); n = ext_select(fd + 1, &rset, NULL, NULL, NULL); if (n == 0) { printf("Timer was runnig off.\n"); } if (FD_ISSET(0, &rset)) { printf("Reading from stdin.\n"); len = ext_read(0, (void *) buffer, sizeof(buffer)); if (len == 0) break; if (num_rem > 0) { i = (i + 1) % num_rem; set_prim.ssp_assoc_id = assoc_id; memcpy(&set_prim.ssp_addr, sar + i, sizeof(struct sockaddr_in)); memcpy(&remote_addr, sar + i, sizeof(struct sockaddr_in)); if (ext_setsockopt(fd, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, (void *) &set_prim, sizeof(set_prim)) < 0) perror("setprim"); } if (ext_sendto(fd, (const void *)buffer, len, 0, (const struct sockaddr *)&remote_addr, sizeof(remote_addr)) != len) perror("sendto"); else printf("Message of length %d sent to %s:%u: %.*s", len, inet_ntoa(remote_addr.sin_addr), ntohs(remote_addr.sin_port), len, buffer); } if (FD_ISSET(fd, &rset)) { printf("Reading from network.\n"); addr_len = sizeof(struct sockaddr_in); buffer_size = sizeof(buffer); if ((len = sctp_recvmsg(fd, (void *) buffer, buffer_size , (struct sockaddr *)&remote_addr, &addr_len, &sri,&msg_flags)) < 0) perror("recvfrom"); else { if(msg_flags & MSG_NOTIFICATION) { process_notification(fd, buffer); continue; } else { printf("Message of length %d received from %s:%u: %.*s", len, inet_ntoa(remote_addr.sin_addr), ntohs(remote_addr.sin_port), len, buffer); } } } } sctp_freepaddrs(sar); if (ext_close(fd) < 0) perror("close"); sleep(2); return 0; }
/* ###### Main program ################################################### */ int main(int argc, char** argv) { union sockaddr_union localAddress; struct pollfd ufds; struct SimpleRedBlackTree objectStorage; struct SimpleRedBlackTree objectDisplay; struct SimpleRedBlackTreeNode* node; unsigned long long now; unsigned long long updateInterval = 1000000; unsigned long long purgeInterval = 30000000; unsigned long long lastUpdate = 0; size_t lastElements = ~0; size_t elements; int result; int reuse; int sd; int n; if(checkIPv6()) { string2address("[::]:0", &localAddress); setPort(&localAddress.sa, 2960); } else { string2address("0.0.0.0:0", &localAddress); setPort(&localAddress.sa, 2960); } for(n = 1;n < argc;n++) { if(!(strncmp(argv[n], "-localaddress=", 14))) { if(string2address((char*)&argv[n][14], &localAddress) == false) { fprintf(stderr, "ERROR: Bad local address <%s>\n", (char*)&argv[n][14]); exit(1); } } else if(!(strncmp(argv[n], "-updateinterval=", 16))) { updateInterval = 1000 * atol((char*)&argv[n][16]); if(updateInterval < 100000) { updateInterval = 100000; } } else if(!(strncmp(argv[n], "-purgeinterval=", 15))) { purgeInterval = 1000 * atol((const char*)&argv[n][15]); if(purgeInterval < 1000000) { purgeInterval = 1000000; } } else if(!(strncmp(argv[n], "-maxpr=", 7))) { maxPRs = atoi((const char*)&argv[n][7]); } else if(!(strncmp(argv[n], "-maxpe=", 7))) { maxPEs = atoi((const char*)&argv[n][7]); } else if(!(strncmp(argv[n], "-maxpu=", 7))) { maxPUs = atoi((const char*)&argv[n][7]); } else if(!(strncmp(argv[n], "-maxlocationsize=", 17))) { maxLocationSize = atoi((const char*)&argv[n][17]); } else if(!(strcmp(argv[n], "-compact"))) { useCompactMode = true; } else if(!(strcmp(argv[n], "-full"))) { useCompactMode = false; } else { printf("Bad argument \"%s\"!\n" ,argv[n]); fprintf(stderr, "Usage: %s {-localaddress=address:port} {-updateinterval=milliseconds} {-purgeinterval=milliseconds} {-compact|-full} {-maxpr=PRs} {-maxpe=PEs} {-maxpu=PUs} {-maxlocationsize=characters}\n", argv[0]); exit(1); } } sd = ext_socket(localAddress.sa.sa_family, SOCK_DGRAM, IPPROTO_UDP); if(sd < 0) { perror("Unable to create socket"); exit(1); } reuse = 1; if(ext_setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) { perror("setsockopt() with SO_REUSEADDR failed"); } if(bindplus(sd, &localAddress, 1) == false) { fputs("ERROR: Unable to bind socket to local address\n", stderr); exit(1); } simpleRedBlackTreeNew(&objectStorage, NULL, cspObjectStorageComparison); simpleRedBlackTreeNew(&objectDisplay, cspObjectDisplayPrint, cspObjectDisplayComparison); puts("Component Status Monitor - Version 1.0"); puts("======================================\n"); installBreakDetector(); printf("\x1b[;H\x1b[2J"); /* The first update should be in 1 second ... */ lastUpdate = getMicroTime() + 1000000 - updateInterval; while(!breakDetected()) { ufds.fd = sd; ufds.events = POLLIN; now = getMicroTime(); while(now - lastUpdate < updateInterval) { now = getMicroTime(); result = ext_poll(&ufds, 1, ((lastUpdate + updateInterval) > now) ? (int)((lastUpdate + updateInterval - now) / 1000) : 0); if((result > 0) && (ufds.revents & POLLIN)) { handleMessage(sd, &objectStorage, &objectDisplay); } else if((result < 0) && (errno == EINTR)) { goto finished; } } purgeCSPObjects(&objectStorage, &objectDisplay, purgeInterval); elements = simpleRedBlackTreeGetElements(&objectStorage); if( (elements != lastElements) || (elements > 0) ) { printf("\x1b[;H"); printTimeStamp(stdout); printf("Current Component Status -- \x1b[31;1m%u PRs\x1b[0m, \x1b[34;1m%u PEs\x1b[0m, \x1b[32;1m%u PUs\x1b[0m\x1b[0K\n\x1b[0K\n\x1b[0K\x1b[;H\n", totalPRs, totalPEs, totalPUs); maxObjectLabelSize = 0; currentPRs = 0; currentPEs = 0; currentPUs = 0; node = simpleRedBlackTreeGetFirst(&objectDisplay); while(node != NULL) { cspObjectDisplayPrint(node, stdout); node = simpleRedBlackTreeGetNext(&objectDisplay, node); } currentObjectLabelSize = maxObjectLabelSize; printf("\x1b[0J"); fflush(stdout); } lastElements = elements; lastUpdate = now; } finished: ext_close(sd); simpleRedBlackTreeDelete(&objectStorage); puts("\nTerminated!"); return(0); }
int main(int argc, char **argv) { int fd, n, addr_len, len; fd_set rset; char buffer[1000]; struct sctp_event_subscribe evnts; struct sockaddr_in local_addr, remote_addr; if (argc != 4) { printf("Usage: client local_port remote_addr remote_port\n"); exit(-1); } if ((fd = ext_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)) < 0) perror("socket"); bzero(&evnts, sizeof(evnts)); if (ext_setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts)) < 0) perror("setsockopt"); bzero(&local_addr, sizeof(struct sockaddr_in)); local_addr.sin_family = AF_INET; #ifdef HAVE_SIN_LEN local_addr.sin_len = sizeof(struct sockaddr_in); #endif local_addr.sin_addr.s_addr = htonl(INADDR_ANY); local_addr.sin_port = htons(atoi(argv[1])); if (ext_bind(fd, (struct sockaddr *) &local_addr, sizeof(local_addr)) != 0) perror("bind"); if (ext_listen(fd, 1) != 0) perror("listen"); remote_addr.sin_family = AF_INET; remote_addr.sin_port = htons(atoi(argv[3])); #ifdef HAVE_SIN_LEN remote_addr.sin_len = sizeof(struct sockaddr_in); #endif remote_addr.sin_addr.s_addr = inet_addr(argv[2]); FD_ZERO(&rset); while (1) { FD_SET(fd, &rset); FD_SET(0, &rset); puts("\n\n\n\nSELECT...\n"); n = ext_select(fd + 1, &rset, NULL, NULL, NULL); if (n == 0) { printf("Timer was runnig off.\n"); } if (FD_ISSET(0, &rset)) { printf("Reading from stdin.\n"); len = ext_read(0, (void *) buffer, sizeof(buffer)); if (len == 0) break; if (ext_sendto(fd, (const void *)buffer, len, 0, (const struct sockaddr *)&remote_addr, sizeof(remote_addr)) != len) perror("sendto"); } if (FD_ISSET(fd, &rset)) { printf("Reading from network.\n"); addr_len = sizeof(struct sockaddr_in); if ((len = ext_recvfrom(fd, (void *) buffer, sizeof(buffer),0,(struct sockaddr *) &remote_addr, &addr_len)) < 0) {perror("recvfrom"); /* puts("STOP!------------------"); exit(1); */ } else printf("Message of length %d received from %s:%u: %.*s", len, inet_ntoa(remote_addr.sin_addr), ntohs(remote_addr.sin_port), len, buffer); } } if (ext_close(fd) < 0) perror("close"); sleep(2); return 0; }