Probleme client serveur
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!
Configuration: Linux Firefox 3.0.6
23 réponses
La problématique centrale est d'envoyer des données du serveur vers le client navigateur via HTTP, plutôt que par une communication socket brute, afin que la page web affiche le message. Des réponses montrent qu'il faut renvoyer des en-têtes HTTP corrects, notamment HTTP/1.0 200 OK, Content-Type: text/html et Content-Length exact, puis le corps HTML, afin que le navigateur interprète et affiche le contenu. Certaines réponses recommandent d'ajuster Content-Length à la longueur exacte du message et d'éviter d'envoyer des données partielles, car le navigateur attend une fin de flux conforme au protocole.
-
Contributeurben tests déja en demandant l'url d'une page, et tests le code...
une fois que ton code fonctionenra, tu passeras à l'image -
Contributeurmalheuseusement je n'arrives pas à compiler avec visual studio 6. Je sais pas si c'est dezs librairies absentes ou quoi....
chez moi j'ai fait ce code (celui que je t'ai donné sur le site cppfrance:
#include "afxsock.h"
#include "afxmt.h"
#define PORT 80
#define MESSAGE "HTTP/1.1 200 OK\r\nContent-length: 32\r\nConnection: close\r\n\r\n<html><body>coucou</body></html>"
Wsocket->Send(MESSAGE,strlen(MESSAGE));
et ca fonctionne... .(j'ai passé un peu la partie serveur de sockets, c'est celle du lien donné plus haut, j'ai juste modifié le message à envoyer) -
Contributeurdésolé, j'ai pas eu le temps de regarder... bon, j'essayerai de faire ca se week end...
-
Ok c'est cool merci, visiblement ca ne peut pas marcher a cause de mon code javascript, puisque j'envoie la requete au serveur l'URL d'une image.
Mais bonj'avoie que je ne sais pas trop comment faire.
Car finalement ce que je voulais reellement faire c'est envoyant un nom (de muscle) du serveur au client, que je recupere et que je peux afficher sur ma page.
-
-
Contributeuroui, 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 -
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> ? -
Contributeur\r\n c'est 2 caractères
le \ ne compte pas, c'est le caractères d'échapement -
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> ? -
Contributeuressayes de rajouter un connection: close dans les entêtes, et fermes bien la connexion à la fin de l'envoi ...
-
Encore faut-il la trouve lol
-
Contributeurce qui est surtout chiant, c'est quand on aura trouvé l'erreur, on se dira "c'était cette toute petite crotte qui bloquait tout" ....
-
Contributeur24 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); -
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 -
Contributeuravant 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 ..
-
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) -
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
-
Contributeuressayes 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)
-
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.... -
Contributeursurtout que c'est suremetn pas grand chose ;)il faut etre root pour installer le pluggin de firefox que je t'ai donné ?
-
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. -
Contributeuras tu espionné les trammes avec un des outils que je t'ai donné ?
- 1
- 2