Wiki source for rnsget


Show raw source

=====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
%%



%%(c;;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 {{backlinks}}
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki