2010-10-22 2 views
3

Comment faire un socket client php qui doit effectuer socket_sendto au serveur socket Linux C qui suit structphp passage c données struct throught programmation socket

typedef struct 
{ 
    UI2    todo; 
    char   rz[LNG_RZ + 1]; 
    char   saId[LNG_SAT_ID + 1]; 
    char   user[LNG_USER + 1]; 
    char   lang[LANGLEN + 1]; 
    SI4    result;  
    UI4    socket; 
    char   text[LNG_ALLG + 1]; 
    char   filename[MAX_PATHLEN]; 
} dmsAuf_Head;   

Il est évident que, PHP est connu pour ne pas soutenir struct comment peut Je passe les données c à la prise en utilisant php

Je sais qu'il ya une astuce pour faire c objet struct selon la méthode ci-dessous:

class dmsAuf_Head { 
    public   todo;    
    public   rz  
    public   saId  
    public   user  
    public   lang  
    public   result;       
    public   socket;   
    public   text 
    public   filename 
} 

$obj = new dmsAuf_Head(); 

mais ce ne serait pas prendre la voiture e de la taille de l'attribut? Une recommandation?


Comment sérialiser tout avant d'envoyer ???

Comme proposé par le développeur du serveur socket c, ils utilisent le code c ci-dessous pour envoyer la valeur au serveur socket c:

rval = send(dms_aufHead->socket, (char *) dms_aufHead, sizeof(dmsAuf_Head), 0); 

Alors, comment puis-je envoyer des données dms_aufHead à l'aide de php au lieu?


Comme proposé par le développeur du serveur socket c, ils utilisent le code c ci-dessous pour envoyer la valeur au serveur socket c:

rval = send(dms_aufHead->socket, (char *) dms_aufHead, sizeof(dmsAuf_Head), 0); 

Alors, comment puis-je envoyer des données dms_aufHead utilisant php au lieu?

Que se passe-t-il si (par exemple) $ rz est seulement 3 caractères (pour ce cas) au lieu de 13 caractères comme longueur désirée? Que devrais-je produire pour PHP?

Répondre

0

Il serait préférable que vous sérialisiez vos données dans un format textuel comme JSON (ou peut-être en utilisant la fonction pack) avant de l'envoyer sur la ligne. Dès réception, vous pouvez le désérialiser dans la structure de données appropriée.

2

Vous aurez besoin de fwrite les données dans le bon ordre. La fonction pack sera utile.

http://us2.php.net/pack

fwrite($sock, pack('v', 0x1234)); // send a 16 bit integer 

Bien sûr, vous devez être prudent sur la façon dont la structure C est construit (rembourrage, etc.), le boutisme la machine cible attend, et ainsi de suite. Pour cette raison, il est généralement préférable que les deux systèmes lisent/écrivent simplement les données nécessaires de manière séquentielle et remplissent les structures manuellement (champ par champ), plutôt que d'essayer de modifier la structure elle-même. gros bloc. Du côté de PHP, il peut ressembler à:

class dmsAuf_Head { 
    public   $todo;    
    public   $rz;  
    public   $saId;  
    public   $user;  
    public   $lang;  
    public   $result;       
    public   $socket;   
    public   $text; 
    public   $filename; 

    public function send($sock) 
    { 
    fwrite($sock, pack('v', $this->todo)); 
    // .. fwrite the rest 
    } 
} 

$foo = new dmsAuf_Head(); 
$foo->send($sock); 

(Notez que vous pouvez construire une seule chaîne tassée et l'envoyer en une seule fois si vous utilisez plusieurs arguments.)

0

Il n'y a pas de telles données protocole/format comme un "c struct" c'est au compilateur C comment il stocke ces données - et jusqu'à programmeur du programme C pour décider comment remplir/récupérer les valeurs de la structure.Même si vous écriviez un client en C en utilisant la même structure, vous devez le convertir en une représentation différente pour le transférer au serveur. La même chose est vraie pour PHP - même si 'serialize' fournit un mécanisme intégré pour créer une représentation portable d'une structure de données PHP.

Vous devez écrire du code PHP pour créer une représentation des données que le serveur peut traiter - ce qui a très peu à voir avec comment le serveur stocke/manipule les données en interne. Pour que le serveur existe, il doit avoir la capacité d'analyser les données dans un format donné - allez trouver ce format et écrivez votre PHP en conséquence. OTOH si le serveur n'existe pas encore, alors il y a des librairies C/C++ disponibles qui analyseront une structure de données sérialisée PHP (voir this SO topic) ou s'il est nécessaire de supporter un protocole plus formel, alors jetez un oeil au savon.