Avatar billede bjering Nybegynder
06. september 2004 - 16:20 Der er 40 kommentarer og
1 løsning

Sidste for idag, det lover jeg, omkring pointer og instance.

Hejsa igen igen (gemmer sig)...

jeg har lige modtaget den nye rutine jeg skal bruge til min server (encrypt, decrypt) og har et problem for ham der lavede den til mig er ikke lige tilgængelig lige nu.

sætter den her til MAX points da uden at det her virker sidder jeg med et stort problem.

problemet er, jeg skal have lavet en pointer til min encryption rutine, ala encryptionserver enc; så jeg har adgang til eg: enc.decrypt( ... )

men da den kører med en default constructor, kan jeg ikke bare init den sådan.

jeg kan da lige smide encrypt.h filen her og så min constructor i source filen

encrypt.h

#pragma warning ( disable: 4786 )

#include "session.h"
#include <map>

template <class ID>
class encryptionserver {

public:
    encryptionserver( unsigned long seed ) {
        encryptionsession::initkeys( seed, first );
    }

    // returns true only for new connections
    bool connect( ID client ) {
        Sessions::_Pairib ib = sessions.insert(
            Sessions::value_type(client, encryptionsession(first.encodekey, first.decodekey))
            );
        return ib.second;
    }

    // returns true only if client was connected
    bool disconnect( ID client ) {
        return (sessions.erase( client ) == 1);
    }

    bool encrypt( ID client, void* buffer, int size ) {
        Sessions::iterator it = sessions.find( client );
        if ( it == sessions.end() ) return false;
        it->second.encode( buffer, size );
        return true;
    }
   
    bool decrypt( ID client, void* buffer, int size ) {
        Sessions::iterator it = sessions.find( client );
        if ( it == sessions.end() ) return false;
        it->second.decode( buffer, size );
        return true;
    }

private:
    typedef std::map<ID, encryptionsession> Sessions;
    Sessions sessions;

    encryptionkeys first;
};

og toppen af source filen

#include <windows.h>
#include <assert.h>
#include <memory.h>
#include <map>
#include "session.h"

typedef unsigned long key[2];

encryptionsession::encryptionsession( key e, key d )
{
    this->e[0] = e[0];
    this->e[1] = e[1];
    this->d[0] = d[0];
    this->d[1] = d[1];
}

encryptionsession::encryptionsession( const encryptionsession& l )
{
    this->e[0] = l.e[0];
    this->e[1] = l.e[1];
    this->d[0] = l.d[0];
    this->d[1] = l.d[1];
}

den ville (normalt) blive init sådan her:

unsigned long seed = 0x12345678;
encryptionserver<char*> ks( seed );

så kunne man altid bruge f.eks

ks.decrypt( .... )

osv...

men da den har en default constuctor er det bare ikke så ment (min gamle system havde IKKE det).

jeg fik at vide det ville være noget med:

You can take the address of the server instance with the usual & operator.
and then you can declare your server as a pointer 'keyserver* ks', then istantiate it when you need. Its constructor will be called only at that moment.

after that you can access it just declaring it with an 'extern' clause where you need.

men det siger mig ikke lige noget, da jeg har aldrig rigtig brugt en constructor til noget endnu.

lidt oplysninger omkring hvad jeg skal gøre for at få den til at funke ville være mega nice.
Avatar billede arne_v Ekspert
06. september 2004 - 16:28 #1
Du kalder vel den constructor som den har - default eller ikke default.
Avatar billede arne_v Ekspert
06. september 2004 - 16:29 #2
Default constructor er bare en uden argument.
Avatar billede bjering Nybegynder
06. september 2004 - 16:29 #3
altså det går fint nok når jeg gør det her

int encrypts()
{
unsigned long seed = 0x12345678;
encryptionserver<char*> ks( seed );

ks.decrypt( ... );
ks.encrypt( ... );

return 0;
}

men ikke hvis jeg gør sådan her

int encrypts()
{
unsigned long seed = 0x12345678;
encryptionserver<char*> ks( seed );

return 0;
}

int decrypt(char * text)
{
ks.decrypt( char * text ... );

return 0;
}

hvis det giver en ide :)

det er den nederste jeg skal bruge.... altså en pointer til encryptionserver hvor constructor kun bliver init på første kald.
Avatar billede bjering Nybegynder
06. september 2004 - 16:50 #4
hum...

extern encryptionserver* ks;

encryptionserver' : use of class template requires template argument list
Avatar billede bjering Nybegynder
06. september 2004 - 16:51 #5
extern encryptionserver<char*> ks( seed );

error C2065: 'seed' : undeclared identifier
Avatar billede bjering Nybegynder
06. september 2004 - 16:51 #6
ved ikke helt hvordan jeg skal vende eller dreje den til den virker.
Avatar billede arne_v Ekspert
06. september 2004 - 16:53 #7
Ja.

Den skal vel kaldes med type:

extern encryptionserver<char *> *ks;
Avatar billede bjering Nybegynder
06. september 2004 - 16:53 #8
og problemet er oxo, den må kun få en seed (key) EN gang, dvs første gang den bruges (bruger logger ind).

derefter laver den selv nye keys.
Avatar billede arne_v Ekspert
06. september 2004 - 16:54 #9
extern encryptionserver<char *> *ks;

og

ks = new encryptionserver<char *>(seed);

et sted inde i en metode/funktion.
Avatar billede bjering Nybegynder
06. september 2004 - 16:55 #10
tror jeg er med nu, prøver lige noget.
Avatar billede arne_v Ekspert
06. september 2004 - 16:56 #11
unsigned long seed = 0x12345678;
encryptionserver<char*> ks( seed );

eller

unsigned long seed = 0x12345678;
encryptionserver<char*> *ks = encryptionserver<char *>( seed );
Avatar billede arne_v Ekspert
06. september 2004 - 16:57 #12
eller hvis det er uden argument:

encryptionserver<char*> ks();

eller

encryptionserver<char*> *ks = encryptionserver<char *>();
Avatar billede arne_v Ekspert
06. september 2004 - 16:57 #13
hov - der manglede lige et par new i de nederste
Avatar billede arne_v Ekspert
06. september 2004 - 16:58 #14
Og husk at det er . med de øverste og -> med de nederste
Avatar billede bjering Nybegynder
06. september 2004 - 17:19 #15
extern encryptionserver<char *> *ks;

og

ks = new encryptionserver<char *>(seed);

init'er ikke min key

prøver den næste i listen :o
Avatar billede bjering Nybegynder
06. september 2004 - 17:23 #16
encryptionserver<char*> *ks =  new encryptionserver<char *>( seed );
crasher.

så næste hehe..
Avatar billede bjering Nybegynder
06. september 2004 - 17:48 #17
næh vil ikke virke ... nogen af dem..
Avatar billede bjering Nybegynder
06. september 2004 - 17:55 #18
jeg VED den virker hvis det hele er i en f.eks som over

int encrypts()
{
unsigned long seed = 0x12345678;
encryptionserver<char*> ks( seed );

ks.decrypt( ... );
ks.encrypt( ... );

return 0;
}

så det må være i den init key den er galt

ks = new encryptionserver<char *>(seed); crasher ikke some den eneste, den init'er et eller andet (hvis jeg skifter key så skifter value, så den tager noget fra key)

dælme wierd..
Avatar billede bjering Nybegynder
06. september 2004 - 17:56 #19
ks = new encryptionserver<char *>(seed);

laver den min long om til en char ?
Avatar billede arne_v Ekspert
06. september 2004 - 18:27 #20
Nej - den laver en encryptionserver klasse som bruger char* og kalder
constructor med en long.
Avatar billede arne_v Ekspert
06. september 2004 - 18:44 #21
Altså - du har kode som:

unsigned long seed = 0x12345678;
encryptionserver<char*> ks( seed );

int encrypts()
{
  ks.encrypt( text );
  return 0;
}

int decrypt(char * text)
{
  ks.decrypt( text );
  return 0;
}

og det crasher ?
Avatar billede bjering Nybegynder
06. september 2004 - 18:54 #22
du mener ks->encrypt( ... ) ... jepsen... crasher
Avatar billede bjering Nybegynder
06. september 2004 - 18:56 #23
f.eks

int startnet()
{
unsigned long seed = 0x12345678;
encryptionserver<char*> ks( seed );

if(connectet())
{
ks.connect ( cip );

}
}

int encrypts()
{
  ks->encrypt( cip, text, size );
  return 0;
}

int decrypt(char * text)
{
  ks->decrypt( cip, text, size );
  return 0;
}
Avatar billede arne_v Ekspert
06. september 2004 - 19:03 #24
Den skal da udenfor startnet !?!?
Avatar billede arne_v Ekspert
06. september 2004 - 19:05 #25
unsigned long seed = 0x12345678;
encryptionserver<char*> ks( seed );

int startnet()
{

if(connectet())
{
ks.connect ( cip );

}
}

int encrypts()
{
  ks.encrypt( cip, text, size );
  return 0;
}

int decrypt(char * text)
{
  ks.decrypt( cip, text, size );
  return 0;
}
Avatar billede arne_v Ekspert
06. september 2004 - 19:05 #26
eller

unsigned long seed = 0x12345678;
encryptionserver<char*> *ks = new encryptionserver<char*>( seed );

int startnet()
{

if(connectet())
{
ks->connect ( cip );

}
}

int encrypts()
{
  ks->encrypt( cip, text, size );
  return 0;
}

int decrypt(char * text)
{
  ks->decrypt( cip, text, size );
  return 0;
}
Avatar billede arne_v Ekspert
06. september 2004 - 19:06 #27
således at startnet og encrypts/decrypts bruger samme ks
Avatar billede bjering Nybegynder
06. september 2004 - 21:17 #28
funker ikke..

den skal oxo inits per connection, hver connection får senere en automatisk genereret key, og den skulle også virke på den måde.

din key bliver regenereret hver gang den er løbet igennem
din key bliver aktiveret med key.connect( cip );

den bliver så gemt i en map med ip:keyd:keye

derfor må key kun init en gang, jeg prøvede begge overfor, ingen af dem virkede (den crashede ikke), men det vil ikke virke på den måde.

har prøvet at ligge en besked ved ham der lavede den for mig.

btw, key systemet han har lavet virker, der var nemlig et testprogram med, problemet er bare at i den kører den bare igennem en gang.. dvs den ikke skal bruges flere steder.

det er meget svært at forklare.
Avatar billede arne_v Ekspert
06. september 2004 - 21:19 #29
Smid de 3 funktioner ind i en klasse og lav ks til en instans variabel i klasse
og hav en instans per connection.
Avatar billede bjering Nybegynder
06. september 2004 - 21:24 #30
erm, men nu er jeg jo ikke så go til det med class's, det er jo derfor jeg er lidt på bar grund med den her...
Avatar billede bjering Nybegynder
06. september 2004 - 21:30 #31
min lille legen med classes har max viden omkring

class system
{
  //venne klasses
  friend class undersystem;

  // alle har adgang
public:

  // kun denne class har adgang
private
 
}

det er omkring det... sådan set da..
Avatar billede bjering Nybegynder
06. september 2004 - 21:31 #32
og så lige

system::system() // constructor
{
}
system::~system() // deconstructor
{
}
Avatar billede arne_v Ekspert
06. september 2004 - 21:34 #33
class bjering
{
public:
  unsigned long seed;
  encryptionserver<char*> *ks;
  bjering()
  {
      seed = 0x12345678;
      ks = new encryptionserver<char*>( seed );
  }
  int startnet()
  {
    if(connectet())
    {
        ks->connect ( cip );
    }
  }
  int encrypts()
  {
      ks->encrypt( cip, text, size );
      return 0;
  }
  int decrypt(char * text)
  {
      ks->decrypt( cip, text, size );
      return 0;
  }
Avatar billede arne_v Ekspert
06. september 2004 - 21:34 #34
hov der mangler en slut }
Avatar billede arne_v Ekspert
06. september 2004 - 21:35 #35
bjering b;
b.startnet();
b.encrypts();
b.decrypts();
Avatar billede arne_v Ekspert
06. september 2004 - 21:37 #36
Avatar billede bjering Nybegynder
06. september 2004 - 22:08 #37
okay det her fatter jeg bare ikke..

prøvede lige at sætte en breakpoint ved decrypt i min crypto fil...
men den breaker aldrig... virker som om den aldrig bliver brugt...
Avatar billede arne_v Ekspert
07. september 2004 - 15:49 #38
Prøv og singel step dig igennem
Avatar billede arne_v Ekspert
07. september 2004 - 15:50 #39
kalder du b.decrypts ?
Avatar billede bjering Nybegynder
08. september 2004 - 16:05 #40
ja, men ok, efter lang tid's overvejelser besluttede jeg at omskrive den gamle til multiuser og den virker nu.

jeg syntes dog stadig du skal have point'sne da du arbejdede hårdt på at hjælpe og jeg fik lært en smule der også..

hvis du skriver et svar arne så er point'sne dine :)
Avatar billede arne_v Ekspert
08. september 2004 - 17:43 #41
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester