rnsget


Get random numbers from RNS (random number server).

usage: rnsget <server-ip> -n <number> -f <format> -d <delimiter>

Programm connects to a random number server (RNS) to request random numbers.
Andreas Tobola (http://tnotes.de/RNS)

General options:
		-h  Print this help
		-n  Get n random bytes from server (default: n = 1)
		-d  Delimiter e.g. ; . (default: space)
		-i  Return server info string

Format options:
		-u  unsigned 16 bit integer format like rand() in C (default)
		-x  hex format
		-b  byte stream like /dev/random at Linux systems




rnsget.c
/*
 *   RNSGET for access to Random Number Server
 *   http://www.tnotes.de/rnsget
 *   Andreas Tobola
 *   2013-03-12
 *  
 */


#include <stdio.h>
#include <stdlib.h>

#include <ctype.h>
#include <unistd.h>

#ifdef _WIN32
    #include <winsock2.h>
    #include <io.h>
#else
    #include <netdb.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
#endif


#include "rnsget_private.h"


#define OF_UNSIGNED16 0
#define OF_HEX        1
#define OF_BYTESTREAM 2
#define OF_CHAR       3

#define MAX_NUM_OF_RAND_BYTES (1024*10)


SOCKET s;
struct sockaddr_in servaddr;
struct sockaddr_in cliaddr;
unsigned char sendline[20];
unsigned char recvline[MAX_NUM_OF_RAND_BYTES];
WSADATA wsa;


char *cDelimiter = NULL;
int outputFormat = OF_UNSIGNED16;
int requestInfo = 0;


// Prototypes
void requestNumbers(unsigned int randNumCount);
void showHelp(char * progName);



int main(int argc, char *argv[])
{

     
   int index;
   int c;
   int n;
   
   unsigned long randNumTotalCount = 1;
     
   opterr = 0;
   
   servaddr.sin_family = AF_INET;
   servaddr.sin_addr.s_addr=inet_addr(argv[1]); // we need to save this before getopt() ist called
   servaddr.sin_port=htons(4224);
     
   
 
   while ((c = getopt (argc, argv, "vhn:d:xubic")) != -1)
     switch (c)
     {
       case 'h':
         showHelp(argv[0]);  
         exit(0);
         break;
         
       case 'n':
         randNumTotalCount = atol(optarg);
         if (randNumTotalCount == 0)
             randNumTotalCount = 1;
         break;        
         
       case 'd':
         cDelimiter = optarg;
         break;
         
       case 'x':
         outputFormat = OF_HEX;
         break;        
         
       case 'b':
         outputFormat = OF_BYTESTREAM;
         break;        
         
       case 'u':
         outputFormat = OF_UNSIGNED16;
         break;        
         
       case 'c':
         outputFormat = OF_CHAR;
         break;      
         
       case 'i':
         requestInfo = 1;
         break;                

       case 'v':
         printf("%s %s",argv[0], VER_STRING);
         exit(0);
         break;
       
       default:
           if (optopt == 'n' || optopt == 'd')
               fprintf (stderr, "Option -%s requires an argument.\n", optopt);
             else if (isprint (optopt))
               fprintf (stderr, "Unknown option `-%c'.\n", optopt);
             else
               fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt);
   
             exit(EXIT_FAILURE);

    }
       
       
   if (cDelimiter == NULL)
       cDelimiter = " ";
 
   //printf ("randNumCount = %u, cDelimiter = %s\n", randNumCount, cDelimiter);
   


   if (argc < 2)
   {
      printf("please define at least a server adress: rnsget <IP address>\nuse rnsget -h for help.\n");
      exit(EXIT_FAILURE);
   }

    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d", WSAGetLastError());
        exit(EXIT_FAILURE);
    }

    //Create a socket
    if((s = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d" , WSAGetLastError());
        exit(EXIT_FAILURE);
    }
   
    // Set Timeout for recv call
    unsigned int iTimeout = 5000; // Millisekunden
    if(    
     setsockopt( s, SOL_SOCKET, SO_RCVTIMEO, (const char *)&iTimeout,
                        sizeof(iTimeout) )
       )
    {    
        printf("Could not set timeout : %d" , WSAGetLastError());
        exit(EXIT_FAILURE);
    }

   //bzero(&servaddr,sizeof(servaddr));



   //Bind
   /*if( bind(s ,(struct sockaddr *)&servaddr , sizeof(servaddr)) == SOCKET_ERROR)
    {
        printf("Bind failed with error code : %d" , WSAGetLastError());
        exit(EXIT_FAILURE);
   }*/



   if (requestInfo==1)
   {
        // Request server info
        sendto(s,"reqI",4,0,(struct sockaddr *)&servaddr,sizeof(servaddr));
     
        n = recvfrom(s,recvline,MAX_NUM_OF_RAND_BYTES,0,NULL,NULL);
        recvline[n] = 0;        
        puts("\n");
        puts(recvline);
     
    }
    else
    {
        const unsigned int serverBufferSize = 1024;
        unsigned int multiRequestCount;
        unsigned int leftCount;
        unsigned int k;
       
        if (outputFormat == OF_UNSIGNED16)
        {
           if (randNumTotalCount % 2 == 1)
               randNumTotalCount++;
        }
       
       
        multiRequestCount = randNumTotalCount / serverBufferSize;
        leftCount = randNumTotalCount % serverBufferSize;
       
        //printf("%u  %u\n\n",multiRequestCount,leftCount);

        for (k=0;k<multiRequestCount;k++)
        {
           requestNumbers(serverBufferSize);
        }
        // order the left numbers
        requestNumbers(leftCount);
           
           

    }
       



 
   closesocket(s);
   WSACleanup();  
   puts("\n");  
   
   return 0;

}



/**
 *
 *
 */

void requestNumbers(unsigned int randNumCount)
{
     
        int n;

        //printf("*** %u ***",randNumCount);

        if (randNumCount == 0)
        {
                return;
        }
       
        sendline[0] = 'r';
        sendline[1] = 'e';
        sendline[2] = 'q';
        sendline[3] = 'R';
        sendline[4] = (unsigned char)(randNumCount & 0xFF);
        sendline[5] = (unsigned char)((randNumCount>>8) & 0xFF);                              
        // Request random numbers
        sendto(s, sendline, 6, 0, (struct sockaddr *)&servaddr,sizeof(servaddr));

        n = recvfrom(s,recvline, MAX_NUM_OF_RAND_BYTES,0,NULL,NULL);
       
        //printf("\n\n[[[%d]]]\n\n",n);
       
   
       
        if (n>0)
        {
           unsigned int k;
           //printf("%d bytes\n", n);
           if (outputFormat == OF_HEX)
           {            
                for (k=0;k<n;k++)
                {
                    printf("%02x%s",recvline[k],cDelimiter);
                }
           }
           else if (outputFormat == OF_BYTESTREAM)
           {
                for (k=0;k<n;k++)
                {
                    putc(recvline[k],stdout);
                }
           }
           else if (outputFormat == OF_UNSIGNED16)
           {
                unsigned int randInt;
                for (k=0;k<n;k+=2)
                {
                    randInt = (unsigned int)(recvline[k]);
                    randInt <<= 8;
                    randInt |= (unsigned int)(recvline[k+1]);                    
                    printf("%u%s",randInt,cDelimiter);
                }                
           }
           else if (outputFormat == OF_CHAR)
           {
                for (k=0;k<n;k++)
                {
                    printf("%u%s",recvline[k],cDelimiter);
                }                
           }
           
        }
        else
        {
            puts("Error: 0 bytes recived from server. Check IP adress.");
            exit(EXIT_FAILURE);
        }
        //fputs(recvline,stdout);
}





void showHelp(char * progName)
{
   printf("\nusage: %s <server-ip> -n <number> -f <format> -d <delimiter>\n\n"\
          "Programm connects to a random number server (RNS) to request random numbers.\n"\
          "Version: %s\n"\
          "Andreas Tobola (http://tnotes.de/rnsget)\n"\
          "\n"\          
          "General options:\n"\
          "\t-h  Print this help\n"\
          "\t-n  Get n random bytes from server (default: n = 1)\n"\
          "\t-d  Delimiter e.g. ; . (default: space)\n"\
          "\t-i  Return server info string\n"\
          "\t-v  return version string\n"\
          "\n"\          
          "Format options:\n"\
          "\t-u  unsigned integer (16 bit) format like rand() in C (default)\n "\
          "\t-c  unsigned char (8 bit) integer format\n "\
          "\t-x  hex (8 bit) format\n "\
          "\t-b  byte stream (8 bit) like /dev/random at Linux systems \n"\
          , progName, VER_STRING);

}




Siehe auch
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki