Probleme client serveur

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!
Configuration: Linux
Firefox 3.0.6

23 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

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.

Bobot (l’IA à votre service)
  1. Contributeur
    ben tests déja en demandant l'url d'une page, et tests le code...

    une fois que ton code fonctionenra, tu passeras à l'image
    1. La requete avec l'url de l'image marche parfaitement, puisque j'arrive a afficher mes images sur ma page web. Ce que je veux faire maintenant c'est juste envoyer une information conne un nom de muscle du serveur a la page web et l'afficher.
  2. Contributeur
    malheuseusement 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)
    1. Le probleme c'est que moi j'envoie une requete a mon serveur avec l'URL d'une image. Est ce que tu penses que c apeut etre ca le pb?
  3. Contributeur
    désolé, j'ai pas eu le temps de regarder... bon, j'essayerai de faire ca se week end...
    1. 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.
  4. Contributeur
    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
    1. 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!
  5. 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> ?
    1. Contributeur
      \r\n c'est 2 caractères
      le \ ne compte pas, c'est le caractères d'échapement
      1. 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> ?
        1. Contributeur
          essayes de rajouter un connection: close dans les entêtes, et fermes bien la connexion à la fin de l'envoi ...
          1. Contributeur
            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" ....
            1. Contributeur
              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);
              1. 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...
            2. 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
              1. Contributeur
                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 ..
                1. 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)
                  1. 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
                    1. Contributeur
                      c'est à dire ? (pas tout comprit moi)
                  2. Contributeur
                    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)
                    1. 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....
                      1. Contributeur
                        surtout que c'est suremetn pas grand chose ;)il faut etre root pour installer le pluggin de firefox que je t'ai donné ?
                        1. 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.
                          1. Contributeur
                            as tu espionné les trammes avec un des outils que je t'ai donné ?
                            • 1
                            • 2