Serveur avec socket Unix + Pointeur de fonctions (contexte memoire ?)

Serveur avec socket Unix + Pointeur de fonctions (contexte memoire ?) - C - Programmation

Marsh Posté le 05-07-2007 à 18:31:55    

Je voulais savoir si c'est possible sous Linux avec des sockets Unix (donc pour serveur / client sur la meme machine) si c'etait possible de faire ce genre de chose qui est possible avec MS Windows :
 
- on a un serveur avec une socket unix
- un client se connecte a cette socket
- faire une requete et recupere une structure composee de pointeur de fonctions
- ensuite le client fait appel au fonctions du serveur grace a ces fonctions qui appelle la memoire du serveur
 
Je reexplique pour etre j'espere un peu plus clair, lorsqu'on a un couple serveur/client avec un serveur qui propose diverses fonctionalites, on a souvent ce type de fonction sur le serveur pour dispatcher les operations :
switch(premier octet recu) {
case 0x01: mypush(); /* operation GET */ break;
case 0x02: mypop(); /* operation PUT */ break;
default: /* operation non reconnue */
}
 
Je sais que sous MS Windows, on peut avoir ce genre de chose, a la premiere requete du client on renvoie :
struct {
pfn_push : mypush;
pfn_pop : mypop;
};
Et ensuite du cote client je peux appeller pfn_push(), pfn_pop() et ces fonctions sont appellees dans le context memoire du serveur.
 
J'aimerais avoir quelque chose d'efficace donc pas de CORBA ou Webservices pour ce genre d'IPC, et eviter la memoire partagee. Je veux une maniere simple et efficace d'appeller des operations sur le serveur, c'est tout ...

Reply

Marsh Posté le 05-07-2007 à 18:31:55   

Reply

Marsh Posté le 05-07-2007 à 20:25:27    

Olivier51 a écrit :

struct {
pfn_push : mypush;
pfn_pop : mypop;
};


C'est quoi ce truc ? En tout cas c'est pas du C.
 
Pour ta question, non, ce n'est pas possible de faire ce que tu dis de la façon que tu proposes. La fonction du serveur est dans l'address space du server. Pour le client elle n'existe pas, ou, si elle existe, elle n'est pas forcément à la même adresse. Il y a bien une raison pour laquelle on a inventé des trucs compliqués dans le genre RPC, CORBA ou DCOP : parce qu'on ne peut peut pas faire ce genre de choses simplement.


Message édité par matafan le 05-07-2007 à 20:27:07
Reply

Marsh Posté le 05-07-2007 à 20:51:34    

Non c'était pas du C, c'est du language abstrait, mais je pense que c'est assez clair pour dire ce que je voulais dire ...
 
Je ne connais que le XMLRPC et CORBA, mais la valeur ajoutée par rapport à ce que je voulais faire c'est que ces deux methodes ajoutent une couche d'abstraction et sont independants du language de programmation ...
 
Avant d'avoir lu ton message, je voulais m'auto-répondre, mais ta réponse confirme bien mes tests ...
 
Du coté serveur :

Citation :

== Client Dispatch (5) ==
res->fn_count: 0x805e514
== Client End (5) ==


 
Du coté client :

Citation :

fnc->fn_count: 0x805e514
 
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1213344064 (LWP 8165)]
0x0805e514 in ?? ()
(gdb) where
#0  0x0805e514 in ?? ()
#1  0x080489de in main () at ../client/client.cpp:101


 
Et je viens de faire la liaison avec MS Windows, le pourquoi du comment ça marche c'est que j'avais utilisé cette méthode en Kernel space pour des process en kernel space.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed