Dialogue C++ / PHP
Dernière réponse : dans Programmation
Bonjour
Voilà, j'ai pour mission de faire dialoguer un programme C++ et un site web.
J'ai donc pensé créer un petit client PHP permettant l'envoie de ligne de commandes (et autres données) via sockets.
Mais j'ai quelques problèmes, j'arrive à faire dialoguer entre eux un serveur PHP et un Client PHP, idem pour deux prog C++, mais impossible de faire réagir mon C++ à mon PHP (ou l'inverse ^^)
Du coté PHP pour mon client, voici comment je procède :
Le connect est toujours "en attente de 127.0.0.1..."
Du coté de mon code C++ :
Voilà voilà
Est-il possible de dialoguer entre ces deux language par cette méthode?
Merci d'avance de vos réponses!
Voilà, j'ai pour mission de faire dialoguer un programme C++ et un site web.
J'ai donc pensé créer un petit client PHP permettant l'envoie de ligne de commandes (et autres données) via sockets.
Mais j'ai quelques problèmes, j'arrive à faire dialoguer entre eux un serveur PHP et un Client PHP, idem pour deux prog C++, mais impossible de faire réagir mon C++ à mon PHP (ou l'inverse ^^)
Du coté PHP pour mon client, voici comment je procède :
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$adresse = "127.0.0.1";
$service_port = "67414";
echo("Connexion a la socket... <br>");
$result = socket_connect($socket, $adresse, $service_port) or die("impossible de se connecter à la socket <br>");
echo("resultat du connect : ".$result."<br>");
while($out = socket_read($socket, 2048))
{
echo $out;
}
socket_close($socket);
echo("Socket fermé!<br>");
Le connect est toujours "en attente de 127.0.0.1..."
Du coté de mon code C++ :
#include "stdafx.h"
#include "stdlib.h"
#include "iostream"
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA WSAData;
int troc;
troc = WSAStartup(MAKEWORD(2,0), &WSAData);
cout<<" _Creation de la socket serveur..."<<endl;
SOCKET sock_serv;
SOCKADDR_IN add_serv;
add_serv.sin_addr.s_addr = INADDR_ANY;
add_serv.sin_family = AF_INET;
add_serv.sin_port = htonl(67414);
sock_serv = socket(AF_INET,SOCK_STREAM,0);
cout<<" _Socket serveur cree!"<<endl;
SOCKET sock_client;
SOCKADDR_IN add_client;
if( bind( sock_serv, (SOCKADDR *)&add_serv, sizeof( add_serv ) ) == SOCKET_ERROR ){
cerr<<"bind a échoué avec l'erreur "<< WSAGetLastError()<< endl;
cerr<<"Le port est peut-être déjà utilisé par un autre processus "<< endl;
closesocket( sock_serv );
WSACleanup();
return 1;
}
else
cout<<" _Bind OK!"<<endl;
if( listen(sock_serv, 0) == SOCKET_ERROR ){
cerr<<"listen a échoué avec l'erreur "<< WSAGetLastError()<< endl;
closesocket(sock_serv);
WSACleanup();
return 1;
}
else
cout<<" _Listen OK!"<<endl;
cout<<" _Serveur correctement demarre!"<<endl;
int longu = sizeof(add_client);
while(1)
{
cout<<" _Attente de l'acceptation de la connection..."<<endl;
if((sock_client=accept(sock_serv,(SOCKADDR *)&add_client,&longu))!=INVALID_SOCKET)
{
cout<<"Socket Thread connecte!"<<endl;
char *requete = new char[10];
int lg;
requete = "bonjour lecteur!\0";
lg=strlen(requete);
cout<<" _Longueur chaine : "<<lg<<endl;
send(sock_client,requete,lg,0);
}
else
cout<<"Socket Thread non connecte!"<<endl;
closesocket(sock_serv);
closesocket(sock_client);
cout<<" _Socket fermee!"<<endl;
system("pause");
return 0;
}
Voilà voilà
Est-il possible de dialoguer entre ces deux language par cette méthode?
Merci d'avance de vos réponses!
Autres pages sur : dialogue php
Lassé par la pub ? Créez un compte
Hello CRicky!
Merci de ta reponse, ni le client ni le serveur ne retourne d'erreur, ils attendent simplement des nouvelles l'un de l'autre ^^
Mon serveur c++ est en attente de l'acceptation sock_client=accept....
Pendant que dans la barre des tâche de Firefox, sur mon client php on à le droit a un petit "En attente de 127.0.0.1..."
Si ça peut t'aider...
Moi je ne vois pas...
Merci de ta reponse, ni le client ni le serveur ne retourne d'erreur, ils attendent simplement des nouvelles l'un de l'autre ^^
Mon serveur c++ est en attente de l'acceptation sock_client=accept....
Pendant que dans la barre des tâche de Firefox, sur mon client php on à le droit a un petit "En attente de 127.0.0.1..."
Si ça peut t'aider...
Moi je ne vois pas...
Le connect doit sortir en time-out (de 75secondes par défaut). Donc, le client n'attend jamais indéfiniment.
S'il y a un time-out, c'est que la connexion ne s'établit pas parce qu'il ne trouve rien.
Peut-être que les ports sont différents.
Lance un client PHP/Serveur PHP, puis client C/Serveur C, avec "netstat -a" regarde si les ports (et protocoles) sont les mêmes dans les 2 cas.
S'il y a un time-out, c'est que la connexion ne s'établit pas parce qu'il ne trouve rien.
Peut-être que les ports sont différents.
Lance un client PHP/Serveur PHP, puis client C/Serveur C, avec "netstat -a" regarde si les ports (et protocoles) sont les mêmes dans les 2 cas.
Bonjour bonjour
Merci pour vos réponses éclairées ^^
J'ai changé de port, je suis passé au port 64535.
Les dialogues PHP/PHP et C++/C++ fonctionnent toujours, mais C++/PHP non!
Suite à un netstat, voici ce que j'obtient lorsque le seveur C++ et le client PHP sont lancés :
TCP Moi:1194 localhost:64535 ESTABLISHED
TCP Moi:64535 localhost:1193 TIME_WAIT
TCP Moi:64535 localhost:1194 ESTABLISHED
La même chose lorsque seul le serveur C++ est lancé :
TCP Moi:1194 localhost:64535 ESTABLISHED
TCP Moi:64535 localhost:1194 ESTABLISHED
Et plus rien sur localhost lorsque les deux sont kickés.
Bon je ne connais pas grand chose en réseau ^^, éclairez moi une fois de plus s'il vous plait
Le port apres localhost correspond bien à celui que je spécifie dans mon programme, qu'il soit C++ ou PHP, mais le port suivant l'hostname de mon PC, ici 1164 ou 1193, à quoi correspond t-il?
Ensuite, pourquoi j'ai trois infos sur localhost quand je lance mon serveur et mon client?Un novice comme moi ne s'attendrait à en voir seulement deux
Encore de grandes interrogations ^^
Merci de votre aide!
edit :
Lors d'un dialogue PHP/PHP j'obtiens ceci:
TCP Moi:64535 localhost:1560 TIME_WAIT
TCP Moi:64535 localhost:1563 TIME_WAIT
TCP Moi:64535 localhost:1564 TIME_WAIT
Merci pour vos réponses éclairées ^^
J'ai changé de port, je suis passé au port 64535.
Les dialogues PHP/PHP et C++/C++ fonctionnent toujours, mais C++/PHP non!
Suite à un netstat, voici ce que j'obtient lorsque le seveur C++ et le client PHP sont lancés :
TCP Moi:1194 localhost:64535 ESTABLISHED
TCP Moi:64535 localhost:1193 TIME_WAIT
TCP Moi:64535 localhost:1194 ESTABLISHED
La même chose lorsque seul le serveur C++ est lancé :
TCP Moi:1194 localhost:64535 ESTABLISHED
TCP Moi:64535 localhost:1194 ESTABLISHED
Et plus rien sur localhost lorsque les deux sont kickés.
Bon je ne connais pas grand chose en réseau ^^, éclairez moi une fois de plus s'il vous plait
Le port apres localhost correspond bien à celui que je spécifie dans mon programme, qu'il soit C++ ou PHP, mais le port suivant l'hostname de mon PC, ici 1164 ou 1193, à quoi correspond t-il?
Ensuite, pourquoi j'ai trois infos sur localhost quand je lance mon serveur et mon client?Un novice comme moi ne s'attendrait à en voir seulement deux
Encore de grandes interrogations ^^
Merci de votre aide!
edit :
Lors d'un dialogue PHP/PHP j'obtiens ceci:
TCP Moi:64535 localhost:1560 TIME_WAIT
TCP Moi:64535 localhost:1563 TIME_WAIT
TCP Moi:64535 localhost:1564 TIME_WAIT
le port différent de 64535 correspond à celui du client, port aléatoire entre 1025-65535
le TIME_WAIT correspond à une connexion rompue (je crois)
sur ton programme que tu as posté, je sais pas si c'est une erreur de frappe mais le while n'est pas fermé, faudrait vérifier ca
La même chose lorsque seul le serveur C++ est lancé :
TCP Moi:1194 localhost:64535 ESTABLISHED
TCP Moi:64535 localhost:1194 ESTABLISHED
la il y a un client qui est lancé?? sinon tu ne devrais pas avoir ces lignes...
le TIME_WAIT correspond à une connexion rompue (je crois)
sur ton programme que tu as posté, je sais pas si c'est une erreur de frappe mais le while n'est pas fermé, faudrait vérifier ca
Citation :
La même chose lorsque seul le serveur C++ est lancé :
TCP Moi:1194 localhost:64535 ESTABLISHED
TCP Moi:64535 localhost:1194 ESTABLISHED
la il y a un client qui est lancé?? sinon tu ne devrais pas avoir ces lignes...
Oui j'ai effectivement une erreur , mais pas sur l'affectation de chaine de caractère :
warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data
Linking...
sur : lg=strlen(requete);
J'avoue que ça m'a choqué l'histoire des 10caractères de requete, mais bon, puisque ça passe, pour le moment je ne m'en occupe pas ^^
C'est vraiment cette histoire de dialogue C++/PHP qui me chagrine...
Je viens de relancer un netstat avec mon serveur C++ seul, et les lignes
TCP Moi:1194 localhost:64535 ESTABLISHED
TCP Moi:64535 localhost:1194 ESTABLISHED
ne sont plus presentes...
Par contre j'ai en localhost ce qui suit :
TCP Moi:1068 localhost:1069 ESTABLISHED
TCP Moi:1069 localhost:1068 ESTABLISHED
TCP Moi:1070 localhost:1071 ESTABLISHED
TCP Moi:1071 localhost:1070 ESTABLISHED
Je viens pourtant de kicker tout ce qui aurais pu avoir une quelconque interaction sur local host (easyphp et tout le reste).
Je vais essayer maintenant de lancer le client php (apres redemarrage de easyphp bien sur ^^)
Bon en fait je reboot, easyphp est dans les choux
warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data
Linking...
sur : lg=strlen(requete);
J'avoue que ça m'a choqué l'histoire des 10caractères de requete, mais bon, puisque ça passe, pour le moment je ne m'en occupe pas ^^
C'est vraiment cette histoire de dialogue C++/PHP qui me chagrine...
Je viens de relancer un netstat avec mon serveur C++ seul, et les lignes
TCP Moi:1194 localhost:64535 ESTABLISHED
TCP Moi:64535 localhost:1194 ESTABLISHED
ne sont plus presentes...
Par contre j'ai en localhost ce qui suit :
TCP Moi:1068 localhost:1069 ESTABLISHED
TCP Moi:1069 localhost:1068 ESTABLISHED
TCP Moi:1070 localhost:1071 ESTABLISHED
TCP Moi:1071 localhost:1070 ESTABLISHED
Je viens pourtant de kicker tout ce qui aurais pu avoir une quelconque interaction sur local host (easyphp et tout le reste).
Je vais essayer maintenant de lancer le client php (apres redemarrage de easyphp bien sur ^^)
Bon en fait je reboot, easyphp est dans les choux
le probleme, c'est qu'en C, quand ca passe, c'est pas forcement bon.
le programmeur a pas mal de liberte, mais s'il n'est pas rigoureux, ca foire
(ah les segmentation fault....)
je t'explique, tu alloues un espace de 10 caractères (donc 9 avec le caractère de terminaison), ensuite tu en écris plus de 9, donc le programme écrit sur un espace mémoire indétérminé ce qui peut causer des dysfonctionnements graves même pour le système.
donc commence d'abord par arranger le code, genre des short quand il faut, bien déclarer les chaînes de caractères etc...
le programmeur a pas mal de liberte, mais s'il n'est pas rigoureux, ca foire
(ah les segmentation fault....)
je t'explique, tu alloues un espace de 10 caractères (donc 9 avec le caractère de terminaison), ensuite tu en écris plus de 9, donc le programme écrit sur un espace mémoire indétérminé ce qui peut causer des dysfonctionnements graves même pour le système.
donc commence d'abord par arranger le code, genre des short quand il faut, bien déclarer les chaînes de caractères etc...
Allez hop, le netstat apres reboot :
Rien
Demarrage de easyphp :
Rien
Lancement du serveur seul :
Rien
Lancement du client PHP apres demarrage du serveur C++ :
TCP Moi:http localhost:1041 ESTABLISHED
TCP Moi:http localhost:1042 ESTABLISHED
TCP Moi:1037 localhost:1038 ESTABLISHED
TCP Moi:1038 localhost:1037 ESTABLISHED
TCP Moi:1039 localhost:1040 ESTABLISHED
TCP Moi:1040 localhost:1039 ESTABLISHED
TCP Moi:1041 localhost:http ESTABLISHED
TCP Moi:1042 localhost:http ESTABLISHED
TCP Moi:1043 localhost:64535 ESTABLISHED
TCP Moi:64535 localhost:1043 ESTABLISHED
Ca pique
A noter que rien ne marche...Enfin ce n'est pas tout a fait vrai!Mon C++ a accepté la connexion, et apparement le
message a été envoyé, par contre rien de reçut...Ca fait maintenant plus d'une minute que php semble attendre en
boucle, pas de timeout...Toujours attente de 127.0.0.1
Et le meilleur reste à venir, je kick le client php et oh joie, oh merveille :
TCP Moi:http localhost:1042 CLOSE_WAI
TCP Moi:1038 localhost:1037 TIME_WAIT
TCP Moi:1042 localhost:http FIN_WAIT_
TCP Moi:1043 localhost:64535 ESTABLISH
TCP Moi:64535 localhost:1043 ESTABLISH
TCP Moi:1044 192.168.43.1:8080 TIME_WAIT
Et si je kick aussi le serveur C++... :
Plus rien!
C'est grave docteur?
Toute ces connexions?
Qu'il reste deux connexions ESTABLISH même apres kickage du client?
Je débute, je tiens à le rappeler ^^
Citation :
Proto Adresse locale Adresse distante EtatRien
Demarrage de easyphp :
Citation :
Proto Adresse locale Adresse distante EtatRien
Lancement du serveur seul :
Citation :
Proto Adresse locale Adresse distante EtatRien
Lancement du client PHP apres demarrage du serveur C++ :
Citation :
Proto Adresse locale Adresse distante EtatTCP Moi:http localhost:1041 ESTABLISHED
TCP Moi:http localhost:1042 ESTABLISHED
TCP Moi:1037 localhost:1038 ESTABLISHED
TCP Moi:1038 localhost:1037 ESTABLISHED
TCP Moi:1039 localhost:1040 ESTABLISHED
TCP Moi:1040 localhost:1039 ESTABLISHED
TCP Moi:1041 localhost:http ESTABLISHED
TCP Moi:1042 localhost:http ESTABLISHED
TCP Moi:1043 localhost:64535 ESTABLISHED
TCP Moi:64535 localhost:1043 ESTABLISHED
Ca pique
A noter que rien ne marche...Enfin ce n'est pas tout a fait vrai!Mon C++ a accepté la connexion, et apparement le
message a été envoyé, par contre rien de reçut...Ca fait maintenant plus d'une minute que php semble attendre en
boucle, pas de timeout...Toujours attente de 127.0.0.1
Et le meilleur reste à venir, je kick le client php et oh joie, oh merveille :
Citation :
Proto Adresse locale Adresse distante EtatTCP Moi:http localhost:1042 CLOSE_WAI
TCP Moi:1038 localhost:1037 TIME_WAIT
TCP Moi:1042 localhost:http FIN_WAIT_
TCP Moi:1043 localhost:64535 ESTABLISH
TCP Moi:64535 localhost:1043 ESTABLISH
TCP Moi:1044 192.168.43.1:8080 TIME_WAIT
Et si je kick aussi le serveur C++... :
Plus rien!
C'est grave docteur?
Toute ces connexions?
Qu'il reste deux connexions ESTABLISH même apres kickage du client?
Je débute, je tiens à le rappeler ^^
Juste pour info le principe des socket :
c'est la fonction bind qui permet d'associer un port à une socket. Si le bind n'est pas précisé, le port est aléatoire.
- Le serveur crée une socket 64535 (par bind) en attente.
- Le client crée une socket avec un nombre aléatoire (par exemple 1050)
- Lorsque la connexion (entre la socket client 1050 et serveur 64535) s'effectue, le serveur crée une nouvelle socket (le retour de la fonction accept(), par exemple 1100), et débranche le lien pour le rebrancher sur la nouvelle socket.
Au final la socket client (1050) est connectée à la nouvelle socket serveur (1100).
Et donc, la socket 64535 est libérée, ce qui permet de refaire une connexion avec de nouveaux clients.
Ce mécanisme est transparent pour le client car une fois la socket connecté, il se contente de communiquer dans la socket (peu importe la port qui est au bout).
c'est la fonction bind qui permet d'associer un port à une socket. Si le bind n'est pas précisé, le port est aléatoire.
- Le serveur crée une socket 64535 (par bind) en attente.
- Le client crée une socket avec un nombre aléatoire (par exemple 1050)
- Lorsque la connexion (entre la socket client 1050 et serveur 64535) s'effectue, le serveur crée une nouvelle socket (le retour de la fonction accept(), par exemple 1100), et débranche le lien pour le rebrancher sur la nouvelle socket.
Au final la socket client (1050) est connectée à la nouvelle socket serveur (1100).
Et donc, la socket 64535 est libérée, ce qui permet de refaire une connexion avec de nouveaux clients.
Ce mécanisme est transparent pour le client car une fois la socket connecté, il se contente de communiquer dans la socket (peu importe la port qui est au bout).
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumPhp boite de dialogue pour imprimer
- ForumLes boites de dialogue avec php
- ForumBoite de dialogue php
- ForumBoite de dialogue javascript en php
- ForumBoite de dialogue confirm javascript varaible php
- ForumCreer une boite de dialogue html php
- ForumOuvrir une boite de dialogue en php
- ForumBoite de dialogue confirm javascript variable php
- ForumC boite de dialogue
- ForumC php
- Voir plus