Probleme client serveur

Fermé
romanzo_cirminale - 23 sept. 2009 à 17:53
 romanzo_cirminale - 29 sept. 2009 à 16:36
Bonjour,

J'ai code un serveur en c++ et j'utilise le navigateur web firefox comme client.
J'au prealable code ma page web en javascript.
Lorsque j'execute une action sur cette page web j'envoie une requete a mon serveur, qui la recoit parfaitement.
Mon probleme se situe dans l'envoi des donnees du serveur au client, pour envoyer les donnees j'ultilise la fonction send() et je sais que si j'avais code un client en c++ j'aurais utilise la fonction recv(). Mais vu que j'utilise le navigateur web comme client, comment recuperer les donnees? si j'envoie une chaine de caractere doit-elle directement s'afficher sur ma page web?

Voici mon serveur
Code : C++

int main(int argc, char** argv)
{
GetRGBValue2();
std::cout << "Slice Server Start\n******************\n" << std::endl;
pthread_mutex_init(&m_SocketMutex, NULL);

// Create Basic Data
int sockfd, on;
struct sockaddr_in self;
char buffer[BUFSIZE];

// Create a socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);

// Setup the socket
bzero(&self, sizeof(self));
self.sin_family = AF_INET;
self.sin_port = htons(SVRPORT);
self.sin_addr.s_addr = INADDR_ANY;

// Allow address re-use so that bind has a better cnance
on = 1;
setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );

// Give our little socket a number
if(bind(sockfd, (struct sockaddr*)&self, sizeof(self)) == -1)
{
std::cout << "ERROR: Socket bind failed" << std::endl;
}

// Make it a server
listen(sockfd, 20);

// Loop the server for eternity
while (1)
{
struct sockaddr_in client_addr;
socklen_t addrlen=sizeof(client_addr);

// Accept connections
pthread_mutex_lock(&m_SocketMutex);
m_Clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen);
pthread_mutex_unlock(&m_SocketMutex);

std::cout << inet_ntoa(client_addr.sin_addr) << ":" <<
ntohs(client_addr.sin_port) << " Connected" << std::endl;

// Receive the data
int msg_size = recv(m_Clientfd, buffer, BUFSIZE, 0);

// Print data
buffer[msg_size] = '\0';

// Process data
char request[255];
char http_ver[255];
sscanf(buffer,"GET %s %s",&request,&http_ver);
cout<<"buffer: "<<buffer<<endl;
std::cout << request << " " << http_ver << std::endl;
std::vector<std::string> tokens;
std::string str(request);
// This does sends reply
ParseGet(request,m_Clientfd);

// Disconnect the client. He's had enough
close(m_Clientfd);
}
} // end main

et voici ma fonction d'envoie des donnees
Code : C++

void ParseGet(std::vector<std::string> request, int clientfd)
{
// j'ai enleve le debut de ma fonction pour ne garder que la partie liee a mon probleme
std::string message = "HTTP/1.0 200 OK\r\nServer: MidasSliceServer\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n";
message+="super ca marche!";
std::cout<<message<<endl;
send(m_Clientfd, message.c_str(), message.size(), MSG_NOSIGNAL);
send(m_Clientfd, "\r\n\r\n", 4, MSG_NOSIGNAL);

}



Donc pour recapitulez dans un premier temps, comment afficher "super ca amrche sur ma page web"
dans un deuxieme temps j'aurais voulue envoiyez ceci comme message au client:
Code : C++

message += "<?php\n\n";
message += "$name = ";
message +="Jean-Claude";
message += "?>";


Et recuperer ces donnees sur ma page web que je coderais alors en php. Est- ce possible?

Merci!

23 réponses

Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
23 sept. 2009 à 18:04
salut
je regardes pas ton code de suite, mais déja, aides toi de wireshark pour regarder les réponses, et de la page de wiki sur le http

ta réponse doit contenir les entetes http (sur firefox j'utilise un pluggin "entetes http en direct" poru les regarder plus facilement

tu dois répondre un truc comme l'exemple de wiki:

HTTP/1.0 200 OK --ca ca veut dire que c'est bon
Date: Fri, 31 Dec 1999 23:59:59 GMT --on s'en fout
Server: Apache/0.8.4 --t'as cas personaliser, mais on s'en fout
Content-Type: text/html --type mime, très important
Content-Length: 59 --la longueur des données qui suivent l'entete (le code html quoi)
Expires: Sat, 01 Jan 2000 00:59:59 GMT --tu t'en fous
Last-modified: Fri, 09 Aug 1996 14:21:40 GMT --tu t'en fous

<TITLE>Exemple</TITLE>
<P>Ceci est une page d'exemple.</P>


ha oui, et chaque ligne se termine par un retour à la ligne: \r\n
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
23 sept. 2009 à 18:07
ajout:
https://codes-sources.commentcamarche.net/

visiblement ca marche aussi en mettant pas la taille et le type
0
romanzo_cirminale
23 sept. 2009 à 18:15
Alors j'ai quand meme change deux trois truc par rapport au depart mais ca ne marche pas et je ne vois pas l'erreur.

Voici ma fonction d'envoie:

std::string message = "HTTP/1.0 200 OK\r\nServer: MidasSliceServer\r\nContent-Type: text/html\r\nContent-Length: 59 \r\n\r\n";
message+="<TITLE>Exemple</TITLE>\r\n" ;
message+="<p>Ceci est une page d'exemple.</p>\r\n";
std::cout<<message<<endl;
send(m_Clientfd, message.c_str(), message.size(), MSG_NOSIGNAL);
send(m_Clientfd, "\r\n\r\n", 4, MSG_NOSIGNAL);
printf("send\n");


et donc si j'affiche dans ma console ca me donne ca, ce qui m'a l'air plutot juste:

HTTP/1.0 200 OK
Server: MidasSliceServer
Content-Type: text/html
Content-Length: 59

<TITLE>Exemple</TITLE>
<p>Ceci est une page d'exemple.</p>

send
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
23 sept. 2009 à 22:01
pourquoi ce send(m_Clientfd, "\r\n\r\n", 4, MSG_NOSIGNAL); ?
0
romanzo_cirminale
23 sept. 2009 à 22:30
hmm je pensais qu'il fallait le mettre un double saute d eligne apres l'envoie des donnees mais peut etre pas. Quoiqu'il arrive ca ne marche pas meme sans.
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
23 sept. 2009 à 23:14
as tu espionné les trammes avec un des outils que je t'ai donné ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
romanzo_cirminale
24 sept. 2009 à 16:35
Malheureusement non, mon administrateur reseau absent et je ne suis pas root.
J'arrive a afficher des images en envoyant une requete avec l'url de l'image a partir du navigateur, puis le sereveur me renvoie l'image mofifie avec send()> Cela marche tres bien je ne comprend pas pourquoi ca ne marche pas avec le html.
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
24 sept. 2009 à 16:38
surtout que c'est suremetn pas grand chose ;)il faut etre root pour installer le pluggin de firefox que je t'ai donné ?
0
romanzo_cirminale
24 sept. 2009 à 17:02
zut j'avais pas vu cette ligne lol, j'ai donc installe LiveHTTPHeaders.
DOnc en observer les reponses http j'ai celle la

HTTP/1.x 200 OK

Server: MidasSliceServer

Connection: close

Content-Type: image/jpeg


donc qui correspond a mon envoie d'image.

Je viens de me rendre compte que je fais deux send() differents a la suite le image/jpg et le text/html ce qui j'ai l'impression ne marche pas.
J'ai donc mis en commentaire l'envoie d'image et laisser l'envoie d'html
et donc j'obtiens ca


HTTP/1.x 200 OK
Server: MidasSliceServer
Content-Type: text/html
Content-Length: 59


mais toujours rien ne s'affiche....
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
24 sept. 2009 à 17:06
essayes d'afficher le source de la page, vu que dans le code il n'y a pas les balsies html... peut etre qu'il a recu, mais qu'il arrive pas à présenter (j'avais du tester ce code avec IE)
0
romanzo_cirminale
24 sept. 2009 à 17:15
alors en ouvrant la source de la page , il me met exactement ce que j'ai code au depart sans avoir change le titre ou rajoute un paragraphe
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
24 sept. 2009 à 17:16
c'est à dire ? (pas tout comprit moi)
0
romanzo_cirminale
24 sept. 2009 à 17:19
bem gros ma page web je l'ai code moi meme en XHTML/javascript/css.
Donc si je comprend bien sir j'envoie <TITLE>Exemple</TITLE> , en affichant la source, il devrait m'avoir change le titre de mon code non? (ou alors j'ai pas compris lol)
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
24 sept. 2009 à 17:23
avant de passer à ta page complète, reste avec mon exemple de 59 caractères, ou sinon modifies bien le content-length . Il doit correspondre exactement à la longueur ..
0
romanzo_cirminale
24 sept. 2009 à 17:31
Donc voila exactement le code que j'ai teste

std::string header ("HTTP/1.0 200 OK\r\nServer: MidasSliceServer\r\nConnection: close\r\nContent-Type: text/html\r\nContent-Length: 22\r\n\r\n");
std::string message("<TITLE>Exemple</TITLE>\r\n") ;
send(m_Clientfd, header.c_str(), header.size(), MSG_NOSIGNAL);
send(m_Clientfd, message.c_str(), message.size(), MSG_NOSIGNAL);


je recoit donc bien l'en tete mias toujours rien ne change dans ma page source
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
24 sept. 2009 à 17:35
24 mon fils, 24 (t'as pas compté le \r\n que t'as ajouté à la fin et qui n'est pas obligatoire)
essayes meme de mettre tout dans le meme envoi, et de rajouter la balise html

std::string header ("HTTP/1.0 200 OK\r\nServer: MidasSliceServer\r\nConnection: close\r\nContent-Type: text/html\r\nContent-Length: 37\r\n\r\n<HTML><TITLE>Exemple</TITLE></HTML>\r\n") ;
send(m_Clientfd, header.c_str(), header.size(), MSG_NOSIGNAL);
0
romanzo_cirminale
24 sept. 2009 à 17:42
ben ecoute j'ai fais un copier/coller de ton code, histoire d'etre sur et ca ne m'affiche toujorus pas le titre exemple. Ca commence a me laisser perplexe...
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
24 sept. 2009 à 17:44
ce qui est surtout chiant, c'est quand on aura trouvé l'erreur, on se dira "c'était cette toute petite crotte qui bloquait tout" ....
0
romanzo_cirminale
24 sept. 2009 à 17:46
Encore faut-il la trouve lol
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
24 sept. 2009 à 17:48
essayes de rajouter un connection: close dans les entêtes, et fermes bien la connexion à la fin de l'envoi ...
0
romanzo_cirminale
24 sept. 2009 à 17:58
Le connection close y etait deja et j'ai un close() apres mon appel de la fonction d'envoi.

J'ai essaye de rajouter la balise <head></head> sans succes.

Est ce que \r\n ca compte pour 2 ou 4?

Et est ce que lorsque j'ouvre la page source c'est cense m'avoir remplace mon <TITLE>Precedent titre</TITLE> par <TITLE>Exemple</TITLE> ?
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
24 sept. 2009 à 17:59
\r\n c'est 2 caractères
le \ ne compte pas, c'est le caractères d'échapement
0
romanzo_cirminale
24 sept. 2009 à 18:02
ok mais ca ne marche tjrs pas
et donc est ce que lorsque j'ouvre la page source c'est cense m'avoir remplace mon <TITLE>Precedent titre</TITLE> par <TITLE>Exemple</TITLE> ?
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
24 sept. 2009 à 18:05
oui, bien sur, dans le code source de la page, tu dois trouver tout ce que tu avais mis après le \r\n\r\n

dans l'exemple que je t'avais donné plus haut, pour faire bien, j'ai zappé car je fais pas souvent de html, il faut mettre <html><head><title>dfsf</title></head></html> (45 caractères en tout il me semble)

je rentre, et j'essaye ca à la maison
0
romanzo_cirminale
24 sept. 2009 à 18:14
Oui j'avais donc essaye avec les head mais ca ne marche toujours pas.
J'attend donc de voir ce que ca donne chez toi. En tout cas merci pour ton aide!
0