Envoyer Http “Post” Demande De Code Php en C ou C++
Je suis en train d'envoyer un "post" reguest à mon fichier php et obtenir les informations de retour, il fonctionne très bien, mais
il a également imprimer quelque chose avant de l'imprimer ma réponse à partir du fichier php. c'est ce qu'il imprimer
première:
HTTP/1.1 200 OK Date: Fri, 20 Apr 2012 10:19:12 GMT Serveur: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8 r DAV/2 PHP/5.3.6 X-Powered-By: PHP/5.3.6 Content-Length: 12 Connection: close Content-Type: text/html
et puis, ma réponse:
bonjour tout le monde
comment puis-je imprimer uniquement ce que j'obtiens des myphp code, sans l':
HTTP/1.1 200 OK Date: Fri, 20 Apr 2012 10:19:12 GMT Serveur: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8 r DAV/2 PHP/5.3.6 X-Powered-By: PHP/5.3.6 Content-Length: 12 Connection: close Content-Type: text/html
le code que j'utilise est:
#include <arpa/inet.h>
#include <assert.h>
#include <errno.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netdb.h>
#include <unistd.h>
#define SA struct sockaddr
#define MAXLINE 4096
#define MAXSUB 200
#define LISTENQ 1024
extern int h_errno;
ssize_t process_http(int sockfd, char *host, char *page, char *poststr)
{
char sendline[MAXLINE + 1], recvline[MAXLINE + 1];
ssize_t n;
snprintf(sendline, MAXSUB,
"POST %s HTTP/1.0\r\n"
"Host: %s\r\n"
"Content-type: application/x-www-form-urlencoded\r\n"
"Content-length: %d\r\n\r\n"
"%s", page, host, strlen(poststr), poststr);
write(sockfd, sendline, strlen(sendline));
while ((n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline[n] = '\0';
printf("%s", recvline); //<-- this
}
return n;
}
int main(void)
{
int sockfd;
struct sockaddr_in servaddr;
char **pptr;
//********** You can change. Puy any values here *******
char *hname = "localhost";
char *page = "/mysql_update.php";
char *poststr = "server=dd sd sdsdt\n";
//*******************************************************
char str[50];
struct hostent *hptr;
if ((hptr = gethostbyname(hname)) == NULL) {
fprintf(stderr, " Server down error for host: %s: %s",
hname, hstrerror(h_errno));
exit(1);
}
printf("hostname: %s \n", hptr->h_name);
if (hptr->h_addrtype == AF_INET
&& (pptr = hptr->h_addr_list) != NULL) {
printf("address: %s\n",
inet_ntop(hptr->h_addrtype, *pptr, str,
sizeof(str)));
} else {
fprintf(stderr, "Error call inet_ntop \n");
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(80);
inet_pton(AF_INET, str, &servaddr.sin_addr);
connect(sockfd, (SA *) & servaddr, sizeof(servaddr));
process_http(sockfd, hname, page, poststr);
close(sockfd);
exit(0);
}
Merci de m'aider à résoudre ce problème, étape par étape, donc, " je peux le comprendre, de me donner de l'information et s'il vous plaît si vous pouvez me montrer un exemple. ( cela va m'aider et d'autres )
- Il serait sans doute utile si vous avez appris un peu sur la façon dont le protocole http qui fonctionne et ce qui un en-tête est.
- Je suis sûr sont à droite, mais qui a vraiment fait de ne pas répondre à quoi que ce soit ou m'aider.
- PlasmaHH est droit et ce qu'il dit des lumières de votre chemin. Vous ne pouvez pas attendre une solution complète sur vos genoux...
- N'est-ce pas un double de stackoverflow.com/questions/2395207/...
Vous devez vous connecter pour publier un commentaire.
Première partie de la réponse que vous avez reçu est composé de version HTTP, Serveur de Code d'État de Réponse et divers-têtes de réponse HTTP.
Après les en-têtes suivantes corps de la réponse HTTP (qui vous devez l'extraire):
En-têtes HTTP et le corps sont séparés par la séquence suivante de caractères:
\r\n\r\n
. Donc tout ce que vous devez faire est de rechercher et d'extraire tout ce qui est derrière elle.Vous pouvez le faire vous-même (sockets, analyse...), mais mon conseil est d'utiliser certains de HTTP bibliothèques:
WinInet
,WinHttp
(les deux sont de Microsoft) oulibCurl
(open source).recvline
tampon contient l'intégralité du message de réponse. Il suffit de chercher pour une séquence\r\n\r\n
dans la mémoire tampon et d'en extraire tous les caractères d'après elle. Btw, le meilleur et le plus sûr approche serait de stocker entrant des caractères dansstd::string
oustd::vector<char>
comme vous pouvez le redimensionner dynamiquement en fonction du nombre d'octets reçus.libCurl
est l'option dans ce casLes réponses bits d'en-tête est séparée du contenu par une ligne vide.
Nécessité de prendre en compte les différentes fins de ligne. Ignorer essentiellement
\r
s.Donc 1er de lire des lignes jusqu'à ce que vous obtenez un vide puis de lancer l'impression de!
MODIFIER
Vous avez une réponse comme suit
Avis qu'il y a une ligne vide entre les en-têtes HTTP et la réponse HTML (dans ce cas).
while
boucle de définir un booléen à false. Avant de faire leprintf
vérifier pour voir si vous avez une ligne vide. Si oui, définir le booléen à true. Alors seulement lesprintf
si ce booléen est vrai.