Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi PHP Socketverbindung in Delphi umbauen(kein Datenempfang) (https://www.delphipraxis.net/58720-php-socketverbindung-delphi-umbauen-kein-datenempfang.html)

Cyberaxx 11. Dez 2005 15:50


PHP Socketverbindung in Delphi umbauen(kein Datenempfang)
 
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.

omata 16. Dez 2005 18:56

Re: PHP Socketverbindung in Delphi umbauen(kein Datenempfang
 
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

Cyberaxx 16. Dez 2005 19:03

Re: PHP Socketverbindung in Delphi umbauen(kein Datenempfang
 
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?

omata 16. Dez 2005 19:10

Re: PHP Socketverbindung in Delphi umbauen(kein Datenempfang
 
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

Cyberaxx 16. Dez 2005 19:17

Re: PHP Socketverbindung in Delphi umbauen(kein Datenempfang
 
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.

omata 16. Dez 2005 20:10

Re: PHP Socketverbindung in Delphi umbauen(kein Datenempfang
 
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

Cyberaxx 17. Dez 2005 02:51

Re: PHP Socketverbindung in Delphi umbauen(kein Datenempfang
 
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;
      }


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 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