=====rnsget===== Get random numbers from [[RNS]] (random number server). %% usage: rnsget -n -f -d 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 %% %%(c;;rnsget.c) /* * RNSGET for access to Random Number Server * http://www.tnotes.de/rnsget * Andreas Tobola * 2013-03-12 * */ #include #include #include #include #ifdef _WIN32 #include #include #else #include #include #include #include #include #include #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 \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>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 -f -d \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 {{backlinks}}