AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi PHP Socketverbindung in Delphi umbauen(kein Datenempfang)
Thema durchsuchen
Ansicht
Themen-Optionen

PHP Socketverbindung in Delphi umbauen(kein Datenempfang)

Ein Thema von Cyberaxx · begonnen am 11. Dez 2005 · letzter Beitrag vom 17. Dez 2005
Antwort Antwort
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#1

PHP Socketverbindung in Delphi umbauen(kein Datenempfang)

  Alt 11. Dez 2005, 15:50
Hallo,

habe Probleme mit einer ClientSocket Verbindung in Delphi. Ich versuche auf einen Chatserver eines Games zu connecten, per PHP klappt es auch soweit, nur wenn ich dann versuche mit dem Delphi Socket eine Verbindung aufzubauen, bekomme ich keine antwort vom Server.
Ich habe keine Ahnung warum ich keine Daten beziehen kann per Delphi, da es mit PHP klappt.

Code:
TCP/IP Verbindung
SOCKET >> Resource id #2 >> OK.
Versuche, eine Verbindung zu 'chat.dt.funcom.com' auf Port '7013' aufzubauen >> OK.
Receive >> " f1d52ec909af0c55739af5e823b5ccc8
Socket schliessen >> OK.
Delphi-Quellcode:
procedure TForm1.btnClick(Sender: TObject);
begin
CSocket.Port := 7013;
CSocket.Host := 'chat.dt.funcom.com';
CSocket.Open;
end;

procedure TForm1.CSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Log.Items.Add('[' + TimetoStr(now) + '] --> Connection established');
end;

procedure TForm1.CSocketConnection(Sender: TObject; Socket: TCustomWinSocket);
begin
Log.Items.Add('[' + TimetoStr(now) + '] --> Connection to ' + CSocket.Port);
end;

procedure TForm1.CSocketRead(Sender: TObject; Socket: TCustomWinSocket);
begin
Log.Items.Add('[' + TimetoStr(now) + '] --> Receive --> ' + CSocket.ReceieText');
end;
Da kommt nun aber garnichts, eigentlich müsste er wie oben den Key schicken, oder versteh ich da was falsch? Wenn ich dagegen die Daten z.B. eines IRC-Servers eintrage bekomme ich Antwort.

Wäre nett wenn mir da jemand helfen könnte.
Daniel
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: PHP Socketverbindung in Delphi umbauen(kein Datenempfang

  Alt 16. Dez 2005, 18:56
Moin,

das funktioniert wunderbar.

Ich bekomme da einen ReceiveText, der aus 38 Zeichen besteht. Diese Zeichenkette enthält allerdings Steuerzeichen, so das du das nicht einfach ausgeben kannst.


MfG
Thorsten
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#3

Re: PHP Socketverbindung in Delphi umbauen(kein Datenempfang

  Alt 16. Dez 2005, 19:03
Hi,

Das habe ich jetzt auch herausgefunden, beim debuggen, das ReceiveText was enthällt.

Code:
Msg = #0#0#0'"'#0'd65163fbdc9b8422abc2a39d51c83d55
So in etwa siehsts aus. Der letzte Teil ist der Key den ich brauche, die frage ist nur wie bekomm ich das so umgebaut, das ich damit was anfangen kann, bzw ihn als String nutzen kann. Wo finde ich eigentlich wofür das #0 steht?
Daniel
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: PHP Socketverbindung in Delphi umbauen(kein Datenempfang

  Alt 16. Dez 2005, 19:10
Versuch es doch mal so...

Delphi-Quellcode:
procedure TForm1.CSocketRead(Sender: TObject; Socket: TCustomWinSocket);
var a, b:string;
    i:integer;
begin
  a:=Socket.ReceiveText;
  b:='';
  for i:=7 to length(a) do
    b:=b+a[i];

  Log.Items.Add('[' + TimetoStr(now) + '] --> Receive --> ' + b);
end;
#0 Steht für das Zeichen 0.

MfG
Thorsten
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#5

Re: PHP Socketverbindung in Delphi umbauen(kein Datenempfang

  Alt 16. Dez 2005, 19:17
Nette Teorie, nur ein Problem da dabei, nach dem Key bzw dem einloggen, kommen andere Daten, wäre also da nicht von Vorteil direkt immer die ersten 7 Zeichen abzutrennen, ansonsten ne gute Idee.
Daniel
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: PHP Socketverbindung in Delphi umbauen(kein Datenempfang

  Alt 16. Dez 2005, 20:10
Ich weiss ja nicht was da wie noch kommt. Aber wenn du sonst alles verarbeiten musst, dann schneidest du eben nur beim ersten Mal die Zeichen ab und sonst nicht.

Das Zeichen #0 steht in C für Zeilenende. Das würde bedeuten das erstmal drei Leerzeilen gesendet werden, dann ein " das #0-Zeichen beendet diese Zeile und dann kommt dein Key. Also was dieses Anführungszeichen da soll weiss ich nicht, das müstest du dann mal genauer untersuchen.

Wie sehen den die Zeilen danach aus? Wie bekommt man die? Was muss man da senden?

MfG
Thorsten
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#7

Re: PHP Socketverbindung in Delphi umbauen(kein Datenempfang

  Alt 17. Dez 2005, 02:51
Das eigentlich wichtige ist der Key, dieser ist eins von drei Segmenten eines Kontroll-Keys den ich an den Server zurück senden muss. DH-Verschlüssellüngsmethode. Laut PHP-Bot, sind da noch Teile enthalten, die bestimmen was für eine Art von Message da vom Server kommt.

Ich weiss jetzt nicht obs was bringt aber ich poste mal die Funktion Get_Packet aus dem Bot, vllt. kann sich damit jemand auseinander setzen, ich komm damit irgendwie nicht so ganz klar...

Code:
   /* The AOChatPacket class - turning packets into binary blobs and binary
    * blobs into packets
    */

   /*
    * I - 32 bit integer: uint32_t
    * S - 8 bit string array: uint16_t length, char str[length]
    * G - 40 bit binary data: unsigned char data[5]
    * i - integer array: uint16_t count, uint32_t[count]
    * s - string array: uint16_t count, aochat_str_t[count]
    *
    * D - 'data', we have relabeled all 'D' type fields to 'S'
    * M - mapping [see t.class in ao_nosign.jar] - unsupported
    *
    */


   $GLOBALS["aochat-packetmap"] = array(
   "in" => array(
      AOCP_LOGIN_SEED      =>    array("name"=>"Login Seed",                  "args"=>"S"),
      AOCP_LOGIN_OK         =>    array("name"=>"Login Result OK",            "args"=>""),
      AOCP_LOGIN_ERROR      =>    array("name"=>"Login Result Error",         "args"=>"S"),
      AOCP_LOGIN_CHARLIST   =>    array("name"=>"Login CharacterList",         "args"=>"isii"),
      AOCP_CLIENT_UNKNOWN   =>    array("name"=>"Client Unknown",               "args"=>"I"),
      AOCP_CLIENT_NAME      =>    array("name"=>"Client Name",                  "args"=>"IS"),
      AOCP_CLIENT_LOOKUP   =>    array("name"=>"Lookup Result",               "args"=>"IS"),
      AOCP_MSG_PRIVATE      =>    array("name"=>"Message Private",            "args"=>"ISS"),
      AOCP_MSG_VICINITY      =>    array("name"=>"Message Vicinity",            "args"=>"ISS"),
      AOCP_MSG_VICINITYA   =>    array("name"=>"Message Anon Vicinity",      "args"=>"SSS"),
      AOCP_MSG_SYSTEM      =>    array("name"=>"Message System",               "args"=>"S"),
      AOCP_CHAT_NOTICE      =>    array("name"=>"Chat Notice",                  "args"=>"IIIS"),
      AOCP_BUDDY_ADD         =>    array("name"=>"Buddy Added",                  "args"=>"IIS"),
      AOCP_BUDDY_REMOVE      =>    array("name"=>"Buddy Removed",               "args"=>"I"),
      AOCP_PRIVGRP_INVITE   =>    array("name"=>"Privategroup Invited",         "args"=>"I"),
      AOCP_PRIVGRP_KICK      =>    array("name"=>"Privategroup Kicked",         "args"=>"I"),
      AOCP_PRIVGRP_PART      =>    array("name"=>"Privategroup Part",            "args"=>"I"),
      AOCP_PRIVGRP_CLIJOIN   =>    array("name"=>"Privategroup Client Join",   "args"=>"II"),
      AOCP_PRIVGRP_CLIPART   =>    array("name"=>"Privategroup Client Part",   "args"=>"II"),
      AOCP_PRIVGRP_MESSAGE   =>    array("name"=>"Privategroup Message",         "args"=>"IISS"),
      AOCP_PRIVGRP_REFUSE   =>    array("name"=>"Privategroup Refuse Invite",   "args"=>"II"),
      AOCP_GROUP_ANNOUNCE   =>    array("name"=>"Group Announce",               "args"=>"GSIS"),
      AOCP_GROUP_PART      =>    array("name"=>"Group Part",                  "args"=>"G"),
      AOCP_GROUP_MESSAGE   =>    array("name"=>"Group Message",               "args"=>"GISS"),
      AOCP_PING            =>    array("name"=>"Pong",                        "args"=>"S"),
      AOCP_FORWARD         =>    array("name"=>"Forward",                     "args"=>"IM"),
      AOCP_ADM_MUX_INFO      =>    array("name"=>"Adm Mux Info",               "args"=>"iii")),
   "out" => array(
      AOCP_LOGIN_REQUEST   =>    array("name"=>"Login Response GetCharLst",   "args"=>"ISS"),
      AOCP_LOGIN_SELECT      =>    array("name"=>"Login Select Character",      "args"=>"I"),
      AOCP_CLIENT_LOOKUP   =>    array("name"=>"Name Lookup",                  "args"=>"S"),
      AOCP_MSG_PRIVATE      =>    array("name"=>"Message Private",            "args"=>"ISS"),
      AOCP_BUDDY_ADD         =>    array("name"=>"Buddy Add",                  "args"=>"IS"),
      AOCP_BUDDY_REMOVE      =>    array("name"=>"Buddy Remove",               "args"=>"I"),
      AOCP_ONLINE_SET      =>    array("name"=>"Onlinestatus Set",            "args"=>"I"),
      AOCP_PRIVGRP_INVITE   =>    array("name"=>"Privategroup Invite",         "args"=>"I"),
      AOCP_PRIVGRP_KICK      =>    array("name"=>"Privategroup Kick",            "args"=>"I"),
      AOCP_PRIVGRP_JOIN      =>    array("name"=>"Privategroup Join",            "args"=>"I"),
      AOCP_PRIVGRP_PART      =>    array("name"=>"Privategroup Part",            "args"=>"I"),
      AOCP_PRIVGRP_KICKALL   =>    array("name"=>"Privategroup Kickall",         "args"=>""),
      AOCP_PRIVGRP_MESSAGE   =>    array("name"=>"Privategroup Message",         "args"=>"ISS"),
      AOCP_GROUP_DATA_SET   =>    array("name"=>"Group Data Set",               "args"=>"GIS"),
      AOCP_GROUP_MESSAGE   =>    array("name"=>"Group Message",               "args"=>"GSS"),
      AOCP_GROUP_CM_SET      =>    array("name"=>"Group Clientmode Set",         "args"=>"GIIII"),
      AOCP_CLIENTMODE_GET   =>    array("name"=>"Clientmode Get",               "args"=>"IG"),
      AOCP_CLIENTMODE_SET   =>    array("name"=>"Clientmode Set",               "args"=>"IIII"),
      AOCP_PING            =>    array("name"=>"Ping",                        "args"=>"S"),
      AOCP_CC               =>    array("name"=>"CC",                           "args"=>"s")));

   class AOChatPacket
   {
      function AOChatPacket($dir, $type, $data)
      {
         echo "
Data".$data."data
";
         $this->args = array();
         $this->type = $type;
         $this->dir = $dir;
         $pmap = $GLOBALS["aochat-packetmap"][$dir][$type];

         if(!$pmap)
         {
            echo "Unsupported packet type (".$dir.", ".$type.")\n";
            return false;
         }

         if($dir == "in")
         {
            if(!is_string($data))
            {
               echo "Incorrect argument for incoming packet, expecting a string.\n";
               return false;
            }

            for($i=0; $i<strlen($pmap["args"]); $i++)
            {
               $sa = $pmap["args"][$i];
               switch($sa)
               {
                  case "I" :
                     $res = array_pop(unpack("N", $data));
                     $data = substr($data, 4);
                     break;

                  case "S" :
                     $len = array_pop(unpack("n", $data));
                     $res = substr($data, 2, $len);
                     $data = substr($data, 2 + $len);
                     break;

                  case "G" :
                     $res = substr($data, 0, 5);
                     $data = substr($data, 5);
                     break;

                  case "i" :
                     $len = array_pop(unpack("n", $data));
                     $res = array_values(unpack("N" . $len, substr($data, 2)));
                     $data = substr($data, 2 + 4 * $len);
                     break;

                  case "s" :
                     $len = array_pop(unpack("n", $data));
                     $data = substr($data, 2);
                     $res = array();
                     while($len--)
                     {
                        $slen = array_pop(unpack("n", $data));
                        $res[] = substr($data, 2, $slen);
                        $data = substr($data, 2+$slen);
                     }
                     break;

                  default :
                     echo "Unknown argument type! (" . $sa . ")\n";
                     continue(2);
               }
               $this->args[] = $res;
            }
         }
         else
         {
            if(!is_array($data))
            {
               $args = array($data);
            }
            else
            {
               $args = $data;
            }
            $data = "";

            for($i=0; $i<strlen($pmap["args"]); $i++)
            {
               $sa = $pmap["args"][$i];
               $it = array_shift($args);

               if(is_null($it))
               {
                  echo "Missing argument for packet.\n";
                  break;
               }

               switch($sa)
               {
                  case "I" :
                     $data .= pack("N", $it);
                     break;

                  case "S" :
                     $data .= pack("n", strlen($it)) . $it;
                     break;

                  case "G" :
                     $data .= $it;
                     break;

                  case "s" :
                     $data .= pack("n", sizeof($it));
                     foreach($it as $it_elem)
                        $data .= pack("n", strlen($it_elem)) . $it_elem;
                     break;

                  default :
                     echo "Unknown argument type! (" . $sa . ")\n";
                     continue(2);
               }
            }

            $this->data = $data;
         }
         return true;
      }
   }

      function read_data($len)
      {
         $data = "";
         $rlen = $len;
         while($rlen > 0)
         {
            if(($tmp = socket_read($this->socket, $rlen)) === false)
            {
               printf("Read error: %s\n", socket_strerror(socket_last_error($this->socket)));
               return "";
            }
            if($tmp == "")
            {
               echo("Read error: EOF\n");
               return "";
            }
            $data .= $tmp;
            $rlen -= strlen($tmp);
         }
         return $data;
      }

      function get_packet()
      {
         $head = $this->read_data(4);
         if(strlen($head) != 4)
            return false;

         list(, $type, $len) = unpack("n2", $head);

         $data = $this->read_data($len);

         if(is_resource($this->debug))
         {
            fwrite($this->debug, "<<<<<\n");
            fwrite($this->debug, $head);
            fwrite($this->debug, $data);
            fwrite($this->debug, "\n=====\n");
         }

         $packet = new AOChatPacket("in", $type, $data);

         switch($type)
         {
            case AOCP_LOGIN_SEED :
            
               $this->serverseed = $packet->args[0];
               echo "test".$args[0];         
               break;

            case AOCP_CLIENT_NAME :
            case AOCP_CLIENT_LOOKUP :
               list($id, $name) = $packet->args;
               $id  = "" . $id;
               $name = ucfirst(strtolower($name));
               $this->id[$id]  = $name;
               $this->id[$name] = $id;
               break;

            case AOCP_GROUP_ANNOUNCE :
               list($gid, $name, $status) = $packet->args;
               $this->grp[$gid] = $status;
               $this->gid[$gid] = $name;
               $this->gid[strtolower($name)] = $gid;
               break;

            case AOCP_BUDDY_ADD :
               list($bid, $bonline, $btype) = $packet->args;
               $this->buddies[$bid] = ($bonline   ? AOC_BUDDY_ONLINE : 0)|
                                      (ord($btype) ? AOC_BUDDY_KNOWN : 0);
               break;

            case AOCP_BUDDY_REMOVE :
               unset($this->buddies[$packet->args[0]]);
               break;
         }

         $this->last_packet = time();

         if(function_exists($this->callback))
         {
            call_user_func($this->callback, $packet->type, $packet->args, $this->cbargs);
         }

         return $packet;
      }
Daniel
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz