Client-serveur avec socket en C (client) vers PHP (serveur) - C - Programmation
Marsh Posté le 08-02-2006 à 15:44:50
Merci bien.
Je viens de regarder ce site, le client et le serveur son en C mais ca peut être un bon départ.
Il faut maintenant que je comprenne le code.
Une idée pour le serveur en PHP ? Et comment faire communiquer un client c avec un serveur php ?
Marsh Posté le 08-02-2006 à 21:27:23
Vilo5 a écrit : Merci bien. |
Un serveur php ? Je pense plutôt qu'il s'agit d'un serveur Apache. Mais regarde donc du coté des fonctions "socket()" dans la doc php... Et va voir aussi sur le forum hardware dans la rubrique php...
Marsh Posté le 13-02-2006 à 08:52:43
Bon alors je suis en train de tester le client-serveur tcp télecharger sur http://pont.net/socket/, merci JagStang pour le lien.
Je voudrai avoir quelque précision pour comprendre comment il marche :
L'orsque je lance le serveur il me dit :
Citation : ../serveur: waiting for data on port TCP 1500 |
et le client :
Citation : usage: ./client <server> <data1> <data2> ... <dataN> |
Je voudrai comprendre dans le client a quoi sert le test suivant :
Code :
|
Que signifie les variables "int argc, char *argv[]" ?
Merci d'avance
Marsh Posté le 13-02-2006 à 12:08:41
Ce sont les arguments que tu passent au programme. argc et le nombre, argv[] sont les parametres. En fait argc vaut toujours au moins 1, et argv[0] c'est le nom de ton programme.
dans ton cas, il faut passer un argument l'ip et le port du server je pense, donc au moins 3 arguments :
client.exe 192.168.1.110 1500 , pour dire a ton client que le server est sur l'adresse 192.... et sur le port 1500. argv[0] est le nom de l'exe client et ensuite argv[1] = ip server argv[2] le port...
Mais document toi un peu sur le main() d'un programme C ..
Marsh Posté le 13-02-2006 à 14:13:48
francky06l a écrit : Ce sont les arguments que tu passent au programme. argc et le nombre, argv[] sont les parametres. En fait argc vaut toujours au moins 1, et argv[0] c'est le nom de ton programme. |
Ok merci bien, je vois.
Pourrait tu m'aider a configurer mon client pour l'adapter a ce que je veut faire.
Pour le moment je souhaite juste créer un client tcp qui se connecte à un serveur "IP:127.0.0.1 sur le port 80" et lui envoie 3 variable x, y, z qui seront pour le moment entrées en dure dans le programme (x=1, y=2, z=3).
J'utilise comme base de départ le programme client tcp trouvé a cette adresse : http://pont.net/socket/
Et le serveur est déjà réalisé en php avec la librairie nusoap.
J'ai donc juste besoin d'un coup d emain pour réaliser mon client qui comme expliquer ci dessus se contente d'envoyer 3 variables x, y et z au serveur.
merci
Marsh Posté le 13-02-2006 à 18:19:09
Salut, j'te renvoie à mon sujet tout fraichement posté :
http://forum.hardware.fr/hardwaref [...] 4747-1.htm
Ce dernier prend ton problème à l'envers, mon serveur est en C et mon client en php. Le code marche sauf quand on envoie rien pendant une durée trop longue (c'était le sujet de mon problème) et ça peut toujours t'aider.
Ciao
Marsh Posté le 13-02-2006 à 23:04:51
krocky a écrit : Salut, j'te renvoie à mon sujet tout fraichement posté : |
Oui j'avais vu ton sujet, mais bon comme tu le dit le pb est à l'envers, de plus ton code en C est pour windows alors que moi mon code en C (le client dans mon cas) sera pour linux. Ca ne m'aide donc pas bc mais merci tout de même. De plus je ne comprend pas vraiment ta logique de faire un client en php et un serveur en C, ca me parait illogique le php est normalement du côté client.
Enfin bref, moi j'essaye de comprendre comment utiliser la librairie gsoap ou autre sous linux.
Marsh Posté le 14-02-2006 à 07:01:25
Pour envoyer x, y, z, ton programme doit prendre 3 arguments supplementaire. Donc argc >= 6, et x, y, z se trouve dans argv[3], argv[4], argv[5]. Je ne sais pas comment est ton serveur, il y a plusieurs facons de transporter ces donnees, en binaire ou en "string". Si c'est en binaire il faut connaitre le "type" (int, int64, short) et transformer argv[3] en utilsant int x = atoi(argv[3]).... Ensuite il faut envoyer tout ca au server en utilisant snd(s, &x, sizeof(int)) ... Encore une fois cela depend de ce qu'attend ton serveur (surtout le format des donnees).
Marsh Posté le 14-02-2006 à 10:43:08
francky06l a écrit : Pour envoyer x, y, z, ton programme doit prendre 3 arguments supplementaire. Donc argc >= 6, et x, y, z se trouve dans argv[3], argv[4], argv[5]. Je ne sais pas comment est ton serveur, il y a plusieurs facons de transporter ces donnees, en binaire ou en "string". Si c'est en binaire il faut connaitre le "type" (int, int64, short) et transformer argv[3] en utilsant int x = atoi(argv[3]).... Ensuite il faut envoyer tout ca au server en utilisant snd(s, &x, sizeof(int)) ... Encore une fois cela depend de ce qu'attend ton serveur (surtout le format des donnees). |
Ok d'accord donc mon test sur argc devra être : argc<6
Je vous communique le code de mon serveur en PHP (sous windows) qui fonctionne pour le moment avec un client en PHP sous windows mais que je souhaite donc remplacer par un client en C sous Linux :
Code :
|
Comme vous pouvez le voir mon serveur éxécute une fonction de contôle d'accès en interrogeant une base de données en fonction des 3 variables envoyés par le client (num-site, num_term et num_carte qui sont en faite les 3 variables x, y et z dont je vous parler avant). La fonction retourne donc ensuite un droit d'accès qui est 0 ou 1 et renvoie se résultat au client.
Voilà il me faut donc un client linux en c qui envoie ces 3 variables au serveur puis récupère le résultat de la fonction "CA" du serveur a savoir le droit d'accès 0 ou 1.
Marsh Posté le 14-02-2006 à 10:57:07
Je suis pas un pro en PHP, mais la vue du code poste ne me donne pas d'indications quant au format des datas. La reception semble faite dans function CA, mais ce n'est pas explicite du point de vue socket...
Marsh Posté le 14-02-2006 à 11:10:02
Et bien les 3 variables seront tout simplement des entiers.
Marsh Posté le 14-02-2006 à 11:38:00
Bon je vais essayer de voir la chose dans un autre sens, immaginons que mes structure sont déjà déclarées.
Comment dois-je écrire dans mon serveur la fonction send qui enverra mes 3 variables (entiers) au serveur ?
Comment dois-je écrire dans mon client la fonction receive qui recevra la réponse à savoir le droit d'accès (encore une fois une variable de type entiers ou encore booléen)?
Marsh Posté le 14-02-2006 à 11:47:21
Dans ce cas, tu peux ecrire ce genre de chose :
int i;
int tab[3];
socket s;
int rc;
for(i=0; i < 3; i++)
tab[i] = atoi(argv[i+3]);
// tu dois avoir cette partie deja dans le client exemple
connect(s, .. .. ..);
// envoi des 3 entiers
rc = send(s, tab, sizeof(int)*3);
if(rc != -1) // test error
rc = recv(s, tab, sizeof(int)); // ici on suppose que ta reponse bool sera un int (0 ou 1), stockee dans tab[0]
closesocket(s);
if(rc != -1)
// process ta reponse (0 ou 1)
voila en gros l'approche, mais considere que dans ce shema on prend des int (attention ils ne sont pas endianess). Si ton serveur PHP attend autre chose que des int ca marchera pas..
Marsh Posté le 14-02-2006 à 15:18:48
Bon voilà j'ai écrit un code mais je ne suis pas du tout sure de mon coup, je rapelle que je débute dans le domaine alors soyez indulgent
voilà le code :
Code :
|
Est-ce que ca parait juste par rapport a ce que je souhaite faire (voir message précédent).
Marsh Posté le 14-02-2006 à 15:27:41
euh non, pas besoin de bind normalement. SI c'est bien le cote client que tu programme, il faut un connect() pas un bind ..Par contre si tu faus pas de connect du tout, ca se connectera pas..
Enfin on peut faire un bind AVANT un connect, mais c'est pas conseille .. Le connect bindera automatiquement sur un couple Ip/port libre.
il faut retirer le bzero the mon_adress et le mettre avant l'adresse serveur, sinon tu mets l'adress serveur mais tu l'ecrases apres..
A la place du bind :
connect(sock, &mon_adress, sizeof(mon_adress));
le send, il manque un autre parametre apres la sizeof(int), ajoute ,0
pareil pour le recv
good luck
Marsh Posté le 14-02-2006 à 15:32:36
Ok merci, c'est sympa, désolé pour le côté newby.
je vais changer ca et je repost juste après.
Marsh Posté le 14-02-2006 à 16:13:12
voilà ce que ca donne si j'ai bien compris ce que tu ma dis :
Code :
|
Marsh Posté le 11-03-2006 à 12:00:54
As-tu essayé ton code ?
Car la directive suivante est utilisée dans le cas d'un serveur :
Code :
|
tu indique n'importe quelle adresse, alors que justement tu dois te connecter sur une adresse précise.
Code :
|
serait plus approprié !
++
Marsh Posté le 11-03-2006 à 19:28:43
Vilo5 a écrit : voilà ce que ca donne si j'ai bien compris ce que tu ma dis : |
Regarde mes commentaires dans ton source...
Code :
|
thechief a écrit : tu indique n'importe quelle adresse, alors que justement tu dois te connecter sur une adresse précise. |
En fait, INADDR_ANY ne signifie pas "n'importe quelle adresse" mais simplement "adresse 0.0.0.0". C'est une macro qui vaut "0", qu'on utilise pour le serveur et qui signifie conventionnellement "pas besoin d'indiquer d'adresse car je suis le serveur"
Marsh Posté le 11-03-2006 à 20:59:44
ReplyMarsh Posté le 11-03-2006 à 21:07:59
thechief a écrit : C'est à peu près ce que je voulais dire, merci des précisions |
Avec plaisir...
Marsh Posté le 12-03-2006 à 10:56:58
J'ai un problème de socket aussi.
Désolé de squatter vilo5 ...
Voici ma portion de code
Code :
|
Mon client se connecte correctement sur le serveur...
Mais juste après il m'affiche les deux erreurs possibles et se termine.
Alors que je n'ai rien envoyé coté serveur.
Ou est l'erreur ?
merci
Marsh Posté le 08-02-2006 à 14:54:39
Slt à tous,
J'espère que je poste bien dans le bon forum, désolé si ce n'est pas le cas.
Je cherche à faire un client serveur avec des socket. Je voudrai avoir des clients en language C et un serveur en PHP. Je débute et ne sais pas trop comment m'y prendre. Je cherche pour le moment à faire un client-serveur très simple, juste réussir à communiquer pour comprendre comment cela fonctionne.
Quelqu'un pourrat'il m'aider.
Merci
Vilo
Message édité par Vilo5 le 08-02-2006 à 14:56:18