Rhaaaa Requete Post http

[Résolu]
Signaler
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
Salut a tous,
Desolé pour ce cri primaire, mais je comprends pas pourquoi ca ne marche pas...
Voici ma la requete que je send :
char canal[200];
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
    SOCKET sock;
    SOCKADDR_IN sin;
    sock = socket(AF_INET, SOCK_STREAM, 0);

    strcat(canal,"POST truc.php HTTP/1.1\r\n");
    strcat(canal,"Host: 1.1.32.80\r\n");
    strcat(canal,"Content-Type: application/x-www-form-urlencoded\r\n");
    strcat(canal,"Content-Length: 11\r\n");
    strcat(canal,"\r\n");
    strcat(canal,"titi=canari\r\n");
    strcat(canal,"\r\n");
    sin.sin_addr.s_addr = inet_addr("1.1.xx.xx");//serveur local
    sin.sin_family = AF_INET;
    sin.sin_port = htons(80); // port HTTP.

connect(sock, (SOCKADDR *)&sin, sizeof(sin))
send(sock, canal, strlen(canal), 0); // on envoie la requête HTTP.
closesocket(sock); // on ferme le socket.
 WSACleanup();

Mon fichier truc.php est censé m'afficher le contenu via ce code : <?php print_r($_POST); ?>
mais ca m'ecris :  Array()
si je mets <?php print_r($_POST['titi']); ?> ca me mets une page vierge

J'ai sniffer avec Wireshark, et ma requete parait bien lancée au serveur :
POST truc.php HTTP/1.1
Host: 1.1.32.80
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

titi=canari

Merci d'avance, je sens que mon erreur est toute bete, mais je suis tout de meme dessus depuis ce matin!

13 réponses

Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

Bon désolé je fais mes questions et mes réponses, mais comme là sa fonctionne autant en faire profiter tout le monde :
Voici au final ma requete :
      strcpy(canal,"POST /toto.php HTTP/1.1\r\n");
    strcat(canal,"Host: ");
    strcat(canal,"1.1.XX.XX");
    strcat(canal,"\r\n");
    strcat(canal,"Connection: Close\r\n");
    strcat(canal,"Content-Type: application/x-www-form-urlencoded\r\n");
    strcat(canal,"Content-Length: ");
    strcat(canal, longueurdelachaine);
    strcat(canal,"\r\n\r\n");
    strcat(canal,"titi=canari&&toto=youpi");
    strcat(canal,"\r\n\r\n");
et le script php :
<?php
    $fp = fopen ("fichierLog.txt", "a+");
    fputs ($fp, "titi= ");
    fputs ($fp, $_POST['titi']);
    fputs ($fp, " AND toto=");
    fputs ($fp, $_POST['toto']);
    fputs ($fp, "\r\n");
    fclose ($fp);
?>
Je recois bien "canari" et "youpi" dans mon "fichierlog"
J'ai créé ce fichier tampon afin de m'assurer si la requete fonctionnait bien...
Merci a tous
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

Euh pour ceux qui auraient pas compris, je cherche a afficher ce que j'envoi via ma methode POST...
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
1 prob possible:

le 1er strcat
strcat(canal,"POST truc.php HTTP/1.1\r\n");
qui sait où se trouve le 1er '\0' de la chaine et surtout s'il y en a 1.

ciao...
BruNews, MVP VC++
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

Salut,
Ok, donc je devrais faire quoi. Essayer avec des printf?
Faire un seul strcat global?
Je ne vois pas trop pour le '/0', car j'ai fait le meme systeme de strcat pour une requete GET precedemment, afin de recuperer d'autres données, et cela fonctionne parfaitement...
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
remplace le 1er strcat par strcpy.

ciao...
BruNews, MVP VC++
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Si la requête est constante, pourquoi ne pas tout mettre dans le même strcpy ?

strcpy(canal,"POST truc.php HTTP/1.1\r\n"
                 "Host: 1.1.32.80\r\n"
                 "Content-Type: application/x-www-form-urlencoded\r\n"
                 "Content-Length: 11\r\n"
                 "\r\n"
                 "titi=canari\r\n"
                 "\r\n");

Ou encore, dès la déclaration de canal ?

char canal[] = "POST truc.php HTTP/1.1\r\n"
                 "Host: 1.1.32.80\r\n"
                 "Content-Type: application/x-www-form-urlencoded\r\n"
                 "Content-Length: 11\r\n"
                 "\r\n"
                 "titi=canari\r\n"
                 "\r\n";

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Aussi, ajouter la chaine dès la déclaration de canal, toujours si la requête est constante, permettrait d'utiliser sizeof (sizeof(canal)-1) au lieu de strlen. Évidament, tant qu'à faire, on pourrait tout aussi bien tout envoyer directement à partir de send mais bon...

C++ (@++)<!--
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

J'essaye tout cela des que possible!
Cependant, l'adresse Host pourra varier ( lue a partir d'un fichier INI), et surtout le contenu ne sera pas si basique, mais une chaine variant, récupérée en fonction d'actions de l'utilisateur.
Ceci dit, si la premiere solution ne fonctionne pas, j'essaierai avec une constante pour voir si le probleme vient de la
Je vous tiens au courant,
Merci bien
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Ah bon. Ben si ta requête n'est pas constante, oublies ce que je viens d'écrire.

Une méthode simple serait d'utiliser sprintf mais comme je risque de me faire tuer par BruNews pour avoir dis une telle chose, je dirais donc que le mieux reste de coder ton propre strcat ou strcpy pour qu'il puisse retourner un pointeur sur le 0 de fin de chaine afin de permettre un chaine direct et aussi, de minimiser les appels à ton strcat ou strcpy.
Voici un exemple simple:

// La fonction strcpy perso
__inline char *mystrcpy (char *dest, char *src)
{
    //while(*dest) dest++; // Décommente cette ligne et tu auras un strcat

    while(*src) *dest++ = *src++;
    *dest = 0;

    return dest;
}

// Dans le code...
char canal[200], *c = canal;

c = mystrcpy(c,"POST truc.php HTTP/1.1\r\n");
c = mystrcpy(c,"Host: 1.1.32.80\r\n");
c = mystrcpy(c,"Content-Type: application/x-www-form-urlencoded\r\n");
c = mystrcpy(c,"Content-Length: 11\r\n\r\n");
mystrcpy(c,"titi=canari\r\n\r\n");

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Oups:
"afin de permettre un chainage direct"

C++ (@++)<!--
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

Snif toujours pas!
Je commence a avoir des doutes, et si ma chaine était bonne e tle probleme venait d'ailleurs? J'ai tout de meme mis le strcpy qui me semble plus sur que tous mes strcat, et j'ai testé ta mathode SAKingdom qui me fait la meme chose.
Donc, lorsque je mets Wireshark sur le coup, je vois que :
    - la requete POST client -> vers serveur fonctionne
    - cest dans l'autre sens qu'il me mets un probleme : serveur-> vers client, l'acquittement plante, et le probleme est au niveau du Cheksum : Bad Checksum=True

Une idée... Ca menerrve lol
ps : on est bien d'accord, la target de mon POST doit bien etre "truc.php" et pas "/truc.php" ?? toute facon j'ai aussi tester la deuxieme, qui me mets une requete 200 OK, mais ki fait rien...
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

Ou alors la requete est incomplete? Me manque peut etre des parametres? Car il a lair de trouver truc.php, si je mets autre chose il renvoi ( dans les snif wireshark toujours) une erreur 404 not found) Or, si pour truc.php fonctionnait vraiment, ne devrait-il pas me mettre un 200 found deja, meme s'en arriver a acquitter??
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
__inline char *mystrcpy (char *dest, char *src)
{
    //while(*dest) dest++; // Décommente cette ligne et tu auras un strcat

    while(*src) *dest++ = *src++;
    *dest = 0;

    return dest;
}

...

char *c = canal;
c = mystrcpy(c,"POST /toto.php HTTP/1.1\r\nHost: ");
c = mystrcpy(c,"1.1.XX.XX");
c = mystrcpy(c,"\r\nConnection: Close\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: ");
c = mystrcpy(c, longueurdelachaine);
mystrcpy(c,"\r\n\r\ntiti=canari&&toto=youpi\r\n\r\n");

Ceci devrait allez plus vite. J'ai aussi essayer de diminuer le nombre d'appel à mystrcpy en réunissant certaines chaines.

C++ (@++)<!--