Echte Zufallszahlen von Server abrufen



  • Ich wollte gerne echte Zufallszahlen von dem auf dieser Seite beworbenen Server einbinden können:

    http://random.irb.hr/

    Es war auch eine Beispieldatei bei:

    #define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
    #include <stdio.h>
    #include <tchar.h>
    
    #include "C:\MinGW\lib\c\qrbg-c.h"
    
    int _tmain(int argc, _TCHAR* argv[]) {
    	defineServer("random.irb.hr", 1227);
    	defineUser("Username", "Password");
    
    	int ret, val;
    	ret = getInt(&val);
    
    	printf("Ret val: %d, Rnd val: %d \n", ret, val);
    
    	return 0;
    }
    

    Username und Password hab ich natürlich entsprechend ersetzt.

    Beim Compilen bekomme ich aber folgenden Fehler:
    C:\MinGW\lib\c\qebg-c.h:40:8: Fehler expected identifier or <<(>> bevore String constant

    Und das noch an einigen weiteren Stellen (41:8 , 42:8 47:8 ...)

    Hier die .h-Datei:

    // The following ifdef block is the standard way of creating macros which make exporting 
    // from a DLL simpler. All files within this DLL are compiled with the CLIENTDLLC_EXPORTS
    // symbol defined on the command line. this symbol should not be defined on any project
    // that uses this DLL. This way any other project whose source files include this file see 
    // CLIENTDLLC_API functions as being imported from a DLL, whereas this DLL sees symbols
    // defined with this macro as being exported.
    #ifdef CLIENTDLLC_EXPORTS
    #define CLIENTDLLC_API __declspec(dllexport)
    #else
    #define CLIENTDLLC_API __declspec(dllimport)
    #endif
    
    // size_t, byte declaration
    #include <stddef.h>
    typedef unsigned char	byte;
    
    //
    // return values for exported functions
    //
    #define ERR_OK                              0
    #define ERR_NOT_INITIALIZED                 1
    #define ERR_INVALID_ARGUMENT                2
    #define ERR_NETWORK_FAILED                  3
    #define ERR_CONNECT_FAILED                  4
    #define ERR_COMMUNICATION_FAILED            5
    // 60 + enum QRBG::ServerResponseCodes
    #define ERR_SERVICE_DENIED_BASE             60
    #define ERR_SERVICE_DENIED_SERVER_STOPPING  61
    #define ERR_SERVICE_DENIED_SERVER_ERROR     62
    #define ERR_SERVICE_DENIED_UNKNOWN_OP       63
    #define ERR_SERVICE_DENIED_ILL_FORMED_REQ   64
    #define ERR_SERVICE_DENIED_TIMOUT           65
    #define ERR_SERVICE_DENIED_AUTH_FAILED      66
    #define ERR_SERVICE_DENIED_QUOTA_EXCEEDED   67
    
    //
    // initialization functions
    //
    extern "C" CLIENTDLLC_API int defineCache(unsigned int cacheSize);
    extern "C" CLIENTDLLC_API int defineServer(const char* qrbgServerAddress, unsigned int qrbgServerPort);
    extern "C" CLIENTDLLC_API int defineUser(const char* qrbgUsername, const char* qrbgPassword);
    
    //
    // single value getters
    //
    extern "C" CLIENTDLLC_API int getByte(byte* value);
    extern "C" CLIENTDLLC_API int getInt(int* value);
    extern "C" CLIENTDLLC_API int getLongInt(long* value);
    extern "C" CLIENTDLLC_API int getFloat(float* value);
    extern "C" CLIENTDLLC_API int getDouble(double* value);
    
    //
    // multiple value (buffer/array) getters
    //
    extern "C" CLIENTDLLC_API int getBytes(byte* buffer, size_t count);
    extern "C" CLIENTDLLC_API int getInts(int* buffer, size_t count);
    extern "C" CLIENTDLLC_API int getLongInts(long* buffer, size_t count);
    extern "C" CLIENTDLLC_API int getFloats(float* buffer, size_t count);
    extern "C" CLIENTDLLC_API int getDoubles(double* buffer, size_t size);
    

    Scheinbar kann er mit dem Begriff Extern nicht umgehen ?!?



  • Das extern "C" ist C++. Merkwürdigerweise scheint der Header ansonsten C zu sein, die Library ist auch C (deswegen extern "C"...). Vielleicht hilft es, wenn du die "C" überall wegmachst.

    Der normale Weg für einen in C und C++ nutzbaren Header wäre, dass man das extern "C"  in #ifdef __cplusplus kapselt.

    Achso, das Unterforum ist, wie der Name schon sagt, für C# und .NET, nicht für C- oder C++-Fragen gedacht...



  • Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum C (C89, C99 und C11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Der Fehler wurde ja schon genannt, aber so als allgemeine Anmerkung: Neuere Prozessoren (z.B. Intels Ivy Bridge Architektur) bieten auch schon direkt im Prozessor echte Hardwarezufallszahlen mit hohem Durchsatz und echtem Zufall an (RdRand). Für geringe Mengen an echten Zufallszahlen (z.B. als Seed für einen PRNG) bieten auch viele Betriebssysteme schon seit langen Zeiten Echtzufallszahlgeneratoren an, die ihre Entropie aus verschiedenen Quellen im System beziehen (Vorsicht bei virtuellen Maschinen!). Unter Linux z.B. /dev/random, unter Windows gibt's das auch, aber ich weiß nicht, wie es heißt.



  • Danke für's verschieben, hatte übersehen, dass ich mich im falschen Unterforum befand, weil ich über einen Link zu diesem Forum kam.

    An CPU hät ich diese
    http://www.amazon.de/Intel-Desktop-Prozessor-Q9550-Sockel-L2-Cache/dp/B0012WDMNC
    und im Laptop einen Intel(R) Core(TM) i3 CPU M 390 @ 2.67GHz

    Unterstützen diese die Funktion bereits?

    Ich hab nur die "C" entfernt und das extern gelassen, daraufhin kam folgende Fehlermeldung:

    Microsoft Windows [Version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

    C:\Users\Verrain>cd desktop

    C:\Users\Verrain\Desktop>gcc t.c -o t
    C:\Users\Verrain\AppData\Local\Temp\ccCdSYDJ.o:t.c:(.text+0x1e): undefined refer
    ence to \_imp\_\_defineServer' C:\\Users\\Verrain\\AppData\\Local\\Temp\\ccCdSYDJ.o:t.c:(.text+0x34): undefined refer ence to_imp__defineUser'
    C:\Users\Verrain\AppData\Local\Temp\ccCdSYDJ.o:t.c:(.text+0x42): undefined refer
    ence to \_imp\_\_getInt' c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: C:\\Users\\V errain\\AppData\\Local\\Temp\\ccCdSYDJ.o: bad reloc address 0x20 in section.eh_fra
    me'
    c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: final link
    failed: Invalid operation
    collect2.exe: Fehler: ld gab 1 als Ende-Status zurück

    C:\Users\Verrain\Desktop>


  • Mod

    Verrain schrieb:

    Unterstützen diese die Funktion bereits?

    Nein, die Technik ist ziemlich neu (etwas über ein Jahr alt).

    Ich hab nur die "C" entfernt und das extern gelassen, daraufhin kam folgende Fehlermeldung:

    Microsoft Windows [Version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

    C:\Users\Verrain>cd desktop

    C:\Users\Verrain\Desktop>gcc t.c -o t
    C:\Users\Verrain\AppData\Local\Temp\ccCdSYDJ.o:t.c:(.text+0x1e): undefined refer
    ence to \_imp\_\_defineServer' C:\\Users\\Verrain\\AppData\\Local\\Temp\\ccCdSYDJ.o:t.c:(.text+0x34): undefined refer ence to_imp__defineUser'
    C:\Users\Verrain\AppData\Local\Temp\ccCdSYDJ.o:t.c:(.text+0x42): undefined refer
    ence to \_imp\_\_getInt' c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: C:\\Users\\V errain\\AppData\\Local\\Temp\\ccCdSYDJ.o: bad reloc address 0x20 in section.eh_fra
    me'
    c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: final link
    failed: Invalid operation
    collect2.exe: Fehler: ld gab 1 als Ende-Status zurück

    C:\Users\Verrain\Desktop>

    Klingt so, als hättest du die Bibliothek selbst nicht dazu gelinkt. Bloß den Header benutzen reicht nicht, irgendwo muss der Code für die Funktionen ja auch gefunden werden.

    edit: Du zeigst ja sogar die Kommandozeile 👍 . Ja, die Bibliothek fehlt. Da muss noch irgendetwas a la -lbibliotheksname hin (und die Bibliothek muss auch gefunden werden). Falls du eine IDE benutzt, gibt es da bestimmt auch eine komfortable Funktion, um das alles automatisch einzurichten. Ansonsten musst du mal gucken, wie das bei mingw genau geht.



  • *hehe*- die Kommandozeile ist mit draufgerutscht 🙂

    Bin auch gerad bei der Internetrechersche drauf gekommen, dass ich die Bibliothek scheinbar nicht richtig gelinkt habe.

    Werde ich mich morgen nochmal mit befassen, wie das unter MingW richtig geht, bis jetzt hab ich einfach nur MingW\lib einen Ordner c erstellt und dort die header Datei, sowie die lib und DLL-Datei reingeschoben, allerdings ist nach dem Ändern, der .h-Datei doch auch die .lib und die .DLL Datei nicht mehr aktuell, oder?

    Verwende Emacs, aber die Bibliotheken sind doch im Compiler hinterlegt und nicht in der Entwicklerumgebung, oder? (Sry, aber das einbinden von Bibliotheken ist für mich generell Neuland ^^)



  • Entweder du schreibst in der Befehlszeile manuell -lPfadzurDatei oder du fügst das bequem in einem Menü der IDE hinzu.


  • Mod

    Verrain schrieb:

    Verwende Emacs, aber die Bibliotheken sind doch im Compiler hinterlegt und nicht in der Entwicklerumgebung, oder? (Sry, aber das einbinden von Bibliotheken ist für mich generell Neuland ^^)

    Die Bibliotheken selber sind weder im Compiler noch in der IDE, sondern irgendwo im System (aber hoffentlich an einem Ort, wo der Compiler oder die IDE gucken).

    Falls du Schwierigkeiten haben solltest, gibt es zu mingw im Netz bestimmt viele Beschreibungen. Falls das nicht reichen sollte, guck/frag mal im hiesigen Compiler und IDE Unterforum nach.



  • Verrain schrieb:

    allerdings ist nach dem Ändern, der .h-Datei doch auch die .lib und die .DLL Datei nicht mehr aktuell, oder?

    Doch, die beschriebene Schnittstelle ist ja die gleiche, nur dass sie jetzt von C aus und nicht nur von C++ aus zugänglich ist.



  • schau mal hier. eine einfach und günstige lösung für physikalische Zufallserzeugung.

    http://www.ibbergmann.org/1851938.htm

    beste grüße



  • Also bis jetzt habe ich es noch immer nicht hinbekommen, dass die .lib Datei vom Compiler gefunden wird und auch im Compiler Untertopic konnte mir noch niemand weiterhelfen 😞



  • Verrain schrieb:

    Also bis jetzt habe ich es noch immer nicht hinbekommen, dass die .lib Datei vom Compiler gefunden wird und auch im Compiler Untertopic konnte mir noch niemand weiterhelfen 😞

    Am einfachsten wird es sein, wenn Du alle heruntergeladenenen und entzippten Dateien in einen einzigen Ordner packst, z.B. nach C:\Users\Verrain\qrdb. In diesem Ordner befindet sich dann Dein Quelltext und die Dateien:

    qrbg-c.lib
    qrbg-c.dll
    qrbg-c.h
    t.c

    Dann manövrierst Du in der Eingabeaufforderung zu diesem Ordner (cd C:\Users\Verrain\qrdb) und setzt den Pfad zu GCC:

    SET PATH=C:\MinGW\bin;%PATH%

    Dann veränderst Du das Include in Deinem Quelltext:

    #include "qrbg-c.h" // Pfad weg!

    Nun rufst Du GCC auf:

    gcc t.c -o t.exe -L.\ -lqrbg-c

    Es müsste klappen ( nicht richtig getestet 🙄 )

    viele grüße
    ralph

    EDIT: So, nun habe ich getestet. Du musst G++ als Compiler nehmen:

    g++.exe -ot.exe t.c -L.\ -lqrbg-c



  • Vielen vielen Dank 🙂

    Lustig, dass trotz g++ eine c Datei rauskomt 🙂



  • Naaa das war natürlich Müll, da hab ich einen gucken lassen 😉

    Natürlich ist es eine .exe Datei 🙂


Anmelden zum Antworten