Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » memcpy socket stream?!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.07.2010, 12:19 Uhr
maczlove



Hallo,

seit Tagen beiße ich mir die Zähne aus. Ich habe ein altes Delphi-Programm, das einen sog. Extentended Communication Header verwendet. Dieses Teil sendet einen Byte-Strom-Kopf über den Socket, bevor die eigentlichen Daten im Klartext versendet werden wie Benutzername, Passwort ...

Ich habe mir im Augenblick so beholfen, dass ich mit einem Netzwerksniffer ein Char-Byte-Array kopiert habe und 1:1 übergebe. Das ist natürlich superbillig und es funktioniert nicht richtig, weil ich keine korrekte zur jeweiligen SessionID passenden ClientID übergeben kann ...

Ich wäre super-dankbar, wenn jemand eine Idee hat. Wie wäre es mit arraycopy in C++ nachbilden?

So sieht der Delphi-Part aus:

Code:
var
ech : TExtendedCommunicationHeader;

...

ZeroMemory(@ech, SizeOf(ech));
ech.PacketType := gcTCPptRequestLogin;
ech.ClientID := SimpleHash(SID);

ech.DataSize := 0;
FTCPClient.WriteBuffer(ech, SizeOf(ech), True);


So sieht bisher mein C++ Part aus:

C++:
typedef struct {
  unsigned char type[16];
  int len;
} ExtendedCommunicationHeader;

unsigned char gcTCPptRequestLogin[16] = { 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xc4, 0x0c, 0x86 };
#define ECH_TYPE_SIZE 16
#define ECH_LEN_SIZE 4
#define ECH_SIZE 20

bool login(std::string user, std::string pwd) {
  ExtendedCommunicationHeader ech;


  memcpy(ech.gcTCPptRequestLogin,ECH_TYPE_SIZE);






  char loginbuffer[128];
  sprintf(loginbuffer,"UserName=%s\r\nPassword=%s\r\ nNotScrambled=1\r\nSupportsUDP=False\r\n", user.c_str(), pwd.c_str());
  if(!pwd.empty()) {
    //login data
    //sprintf(loginbuffer,"Password=%s\r\n", pwd.c_str());
    printf(loginbuffer,"Password=%s\r\n", pwd.c_str());

  }

  // generate session uiid
  sprintf(loginbuffer,"%sSID={%s}\r\n", loginbuffer, this->sessionid);





  ech.len=strlen(loginbuffer);

  // connect the server
  if(connectToServer()) {
    printf("send header\n");
    int sent = send(this->s,&ech, ECH_SIZE,0);

    printf("send login info\n");
    sent += send(this->s,loginbuffer, ech.len,0);

    printf("receive answer\n");
    int cnt = recv(this->s,&ech,ECH_SIZE,0);

    if(memcmp(gcTCPptAnswerLoginRequestOK,ech.type,1)= =0) {
      printf("login ok\n");
      return true;
    } else {
      printf("login something wrong ...\n");
      printHex(&ech,ECH_TYPE_SIZE);
    }
  }

  return false;
}



In Java habe ich es hinbekommen, da kenne ich mich besser aus als in C++, so sieht es in Java funktionierend aus:


C++:
  try {
    socket = (SocketConnection)Connector.open("socket://" + host + ":" + port, 3, true);
    int status = -1;
    dos = socket.openDataOutputStream();
    dis = socket.openDataInputStream();
    buff = new byte[20];
    all_receive_byte = all_receive_byte + 20;
    System.arraycopy(conn_type.toByte(gcTCPptRequestLo gin, true), 0, buff, 0, 4);
    System.arraycopy(conn_type.toByte(t_data_time, true), 0, buff, 4, 8);
    System.arraycopy(conn_type.toByte(reserved, true), 0, buff, 12, 4);
    System.arraycopy(conn_type.toByte(auth.length(), true), 0, buff, 16, 4);
    dos.write(buff, 0, 20);
    buff = new byte[auth.length()];
    buff = auth.getBytes();
    all_receive_byte = all_receive_byte + auth.length();
    dos.write(buff, 0, auth.length());
    buff = new byte[20];
    dis.read(buff);
    all_receive_byte = all_receive_byte + 20;
    status = conn_type.toInt(buff, true);


    if(status != gcTCPptAnswerLoginRequestOK) {
      is_authorize = false;
      return 2;
    } else {
      is_authorize = true;
      return 1;
    }



Bearbeitung von 0xdeadbeef:

code/cpp-Tags eingefügt, Code eingerückt. Nächstes mal selbst machen!


Dieser Post wurde am 08.07.2010 um 13:33 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.07.2010, 13:52 Uhr
ao

(Operator)


Sorry, aber ich hab keine Lust, Code in drei verschiedenen Sprachen zu vergleichen. Was ist das Problem?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.07.2010, 14:02 Uhr
maczlove



[quote]Sorry, aber ich hab keine Lust, Code in drei verschiedenen Sprachen zu vergleichen. Was ist das Problem?[/quote]

Das Problem ist, was ist folgender Java Code in C++ bzw. wie kann man den Extended Commnication Header in C++ ausdrücken:


buff = new byte[20];
all_receive_byte = all_receive_byte + 20;
System.arraycopy(conn_type.toByte(gcTCPptRequestLo gin, true), 0, buff, 0, 4);
System.arraycopy(conn_type.toByte(t_data_time, true), 0, buff, 4, 8);
System.arraycopy(conn_type.toByte(reserved, true), 0, buff, 12, 4);
System.arraycopy(conn_type.toByte(auth.length(), true), 0, buff, 16, 4);
dos.write(buff, 0, 20);

Dieser Post wurde am 08.07.2010 um 14:05 Uhr von maczlove editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.07.2010, 15:16 Uhr
Hans
Library Walker
(Operator)


Hi,

wieso lässt Du den Delphicompiler nicht einfach eine obj-Datei erstellen, die später zum C++ Programm dazu gelinkt wird? Und gibt es in der Doku von Delphi keine näheren Informationen zu dem Ext. Header?
Nur mal so ein paar Fragen, die soich mir dazu stellen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.07.2010, 16:19 Uhr
~maczlove
Gast



Zitat von Hans:
Hi,

wieso lässt Du den Delphicompiler nicht einfach eine obj-Datei erstellen, die später zum C++ Programm dazu gelinkt wird? Und gibt es in der Doku von Delphi keine näheren Informationen zu dem Ext. Header?
Nur mal so ein paar Fragen, die soich mir dazu stellen.

Hans



Naja, das ist eines dieser Projekte nach dem Motto: Kein Quelltext, Firma kaputt, bewaffne Dich mit Netzwerksniffer und dann mit dem Kopf durch die Wand :-(

Zurück zur eigentlichen Frage, ich hatte an so was ähnliches gedacht - scheint aber noch der Wurm drin zu sein, siehst Du ein Problem:


C++:
unsigned char buffer[20];
        
        
        std::string typeof_ = "210";
        std::string empty_ = "   \0";
        
        long t_date_time = 0.0f;
        long reserved_ = simpleHash(this->sessionid);
        
        //const char *a_typeof_ = typeof_.data();
        
        const char *a_reserved_[ sizeof reserved_ ];
        memcpy( a_reserved_, &reserved_, sizeof a_reserved_ );
        
        const char *a_t_date_time_[ sizeof t_date_time ];
        memcpy( a_t_date_time_, &t_date_time, sizeof a_t_date_time_ );
        
        const char *a_typeof_[ sizeof typeof_ ];
        memcpy( a_typeof_, &typeof_, sizeof a_typeof_ );
        
        const char *a_empty_[ sizeof empty_ ];
        memcpy( a_empty_, &empty_, sizeof a_empty_ );
        
        
        memcpy(buffer + 0, a_typeof_, 4);
        
        memcpy(buffer + 4, a_t_date_time_, 8);
        
        memcpy(buffer + 12, a_reserved_, 4);
        
        memcpy(buffer + 16, a_empty_, 4);
        

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.07.2010, 17:15 Uhr
ao

(Operator)



C++:
        const char *a_reserved_[ sizeof reserved_ ];
        memcpy( a_reserved_, &reserved_, sizeof a_reserved_ );



a_reserved_ ist ein Array von Pointern auf char. Für ein Array von char (was du vermutlich willst) deklariere folgendes:


C++:
        const char a_reserved_[ sizeof reserved_ ];
        memcpy( a_reserved_, &reserved_, sizeof a_reserved_ );



Die anderen Arrays entsprechend.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: