static void*
handle_daytime(void *arg)
{
    int fd;
    int timeAsStringLen;
    char *timeAsString;
    time_t now;

    fd = *((int *) arg);
    free(arg);
    
    pthread_detach(pthread_self());
    
    time(&now);
    timeAsString = ctime(&now);
    timeAsStringLen = strlen(timeAsString);
    
    if (timeAsStringLen != ext_send(fd, timeAsString, timeAsStringLen, 0)) {
            printf("%-6d: Writing the daytime failed.\n", fd);
    }
    if (vverbose) {
        printf("%-6d: Daytime sent back: %s", fd, timeAsString);
        fflush(stdout);
    }

    ext_close(fd);
    if (verbose) {
        printf("%-6d: Connection closed.\n", fd);
        fflush(stdout);
    }
    return(NULL);
}
static void*
handle_echo(void *arg)
{
    int fd;
    int n;
    char buffer[BUFFER_SIZE];

    fd = *((int *) arg);
    free(arg);
    
    pthread_detach(pthread_self());

    while ((n=ext_read(fd, buffer, sizeof(buffer))) >  0){
        if (vverbose) {
            printf("%-6d: Echoing %u bytes.\n", fd, n);
            fflush(stdout);
        }
        if (n != ext_send(fd, buffer, n, 0)) {
            printf("%-6d: Writing %u bytes failed.\n", fd, n);
        }
    }
    ext_close(fd);
    if (verbose) {
        printf("%-6d: Connection closed.\n", fd);
        fflush(stdout);
    }
    return(NULL);
}
static void*
handle_chargen(void *arg)
{
    int fd;
    int n, length;
    char buffer[BUFFER_SIZE];

    fd = *((int *) arg);
    free(arg);
    
    pthread_detach(pthread_self());
    
    length = 1400; /*+ (random() % 512);*/
    memset(buffer, 'A', length);
    buffer[length-1] = '\n';

    while ((n=ext_send(fd, buffer, length, 0)) >  0){
        if (vverbose) {
            printf("%-6d: sending %u bytes.\n", fd, n);
            fflush(stdout);
        }
        if (n != ext_send(fd, buffer, n, 0)) {
            printf("%-6d: Writing %u bytes failed.\n", fd, n);
        }
        length = 1400; /*+ (random() % 512)*/
        memset(buffer, 'A', length);
        buffer[length-1] = '\n';
    }
    ext_close(fd);
    if (verbose) {
        printf("%-6d: Connection closed.\n", fd);
        fflush(stdout);
    }
    return(NULL);
}
Exemple #4
0
static int checkIPv6()
{
   int sd = ext_socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
   if(sd >= 0) {
      ext_close(sd);
      return(1);
   }
   return(0);
}
Exemple #5
0
static void echo(int fd, int socketModeUDP)
{
   struct  sctp_sndrcvinfo  sri;
   char                     buf[BUFLEN];
   size_t                   buflen;
   ssize_t                  received;
   int                      flags;
   unsigned int             outgoing = 1;
   union sctp_notification *snp;

   /* Wait for something to echo */
   buflen = sizeof(buf);
   flags  = 0;
   received = sctp_recvmsg(fd, buf, buflen, NULL, 0, &sri, &flags);
   while(received > 0) {
      /* Intercept notifications here */
      if(flags & MSG_NOTIFICATION) {
         snp = (union sctp_notification *)buf;
         if(snp->sn_header.sn_type == SCTP_ASSOC_CHANGE) {
            /* incoming = snp->sn_assoc_change.sac_inbound_streams; */
            outgoing = snp->sn_assoc_change.sac_outbound_streams;
         }
         handle_event(buf);
      }
      else {
         printf("got %u bytes on stream %hu:\n", (unsigned int)received, sri.sinfo_stream);
         fflush(stdout);
         write(0, buf, received);

         /* Echo it back */
         if(sctp_sendmsg(fd, buf, received, NULL, 0,
                         0x29091976, 0,
                         sri.sinfo_stream % outgoing,
                         0, 0) < 0) {
            perror("sendmsg");
            exit(1);
         }
      }

      buflen = sizeof(buf);
      flags  = 0;
      received = sctp_recvmsg(fd, buf, buflen, NULL, 0, &sri, &flags);
   }

   if(received < 0) {
      perror("sctp_recvmsg");
   }
   if(socketModeUDP == 0) {
      ext_close(fd);
   }
}
Exemple #6
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;
}
Exemple #7
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);
}
Exemple #8
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;
}