2012-04-20 15 views
1

私の応答をphpファイルから印刷する前に。なし、それはまた何かを印刷し、私は私のPHPファイルに「ポスト」reguestを送信し、戻って情報を取得しようとしている、それがうまく動作しますが、</p> <p>てるCにPHPのコードへのHTTP「POST」リクエストを送信したり、C++

 
hello world 

がどのように私は私がmyphpコードから取得しています何を印刷することができます:

 
HTTP/1.1 200 OK 
Date: Fri, 20 Apr 2012 10:19:12 GMT 
Server: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8r DAV/2 PHP/5.3.6 
X-Powered-By: PHP/5.3.6 
Content-Length: 12 
Connection: close 
Content-Type: text/html 

 
HTTP/1.1 200 OK 
Date: Fri, 20 Apr 2012 10:19:12 GMT 
Server: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8r DAV/2 PHP/5.3.6 
X-Powered-By: PHP/5.3.6 
Content-Length: 12 
Connection: close 
Content-Type: text/html 

、その後、私の応答:これは

最初に印刷するものです

私が使用しているコードは:

#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); 


} 

この問題を解決するのを手伝ってください。私はそれを理解することができます。私は情報を与えてくれれば教えてください。 (これは私と他人を助けるでしょう)

+3

httpプロトコルがどのように動作するか、ヘッダが何であるかを少し学んだ方が役に立ちます。 – PlasmaHH

+0

私はそうだと確信していますが、それは本当に何も答えなかったり、私を助けたりしていませんでした。 – user1341993

+2

PlasmaHHが正しいです。あなたはあなたのラップで完全なソリューションを期待することはできません... – Malkocoglu

答えて

6

受信した応答の最初の部分は、HTTPバージョン、サーバー応答ステータスコード、およびさまざまなHTTP応答ヘッダーで構成されています。

HTTP/1.1 200 OK日:金、2012年4月20日午前十時19分12秒GMTサーバー: のApache/2.2.21(Unixの)のmod_ssl/2.2.21 OpenSSLの/ 0.9.8r DAV/2 PHP/5.3.6 X-Poweredのバイ:PHP/5.3.6のContent-Length:12接続:クローズ のContent-Type:text/htmlの

ヘッダの後には、(あなたが抽出する必要があります)HTTPレスポンスボディを次の:

hello world

HTTPヘッダーと本文は、次の文字列(\r\n\r\n)で区切られています。だから、あなたがする必要があるのは、それを検索し、その背後にあるすべてを抽出することだけです。またはlibCurl(オープンソース)(両方は、Microsoftのある)WinInetWinHttp

あなたはこの自分自身(ソケット、...パース)を行うことができますが、私のアドバイスは、HTTPライブラリの一部を使用することです。

+0

あなたは私に任意のコードexmapleを教えてください。 – user1341993

+0

受信メッセージが短いのでループ内の1回の反復で受信していると思いますが(これに頼らないでください!) - TCPは多くの小さなメッセージ'recvline'バッファーには全体の応答メッセージが入っています。バッファ内の '\ r \ n \ r \ n'というシーケンスを検索し、その後ろのすべての文字を抽出するだけです。 Btwでは、受け取った文字を 'std :: string'または' std :: vector 'に格納する方が、受信したバイト数に応じて動的にサイズを変更できるので、より良い、より安全な方法です。 –

+0

ここでは、WinHTTPを使用してHTTP応答から本文を抽出する方法を簡単かつ簡単に示しています。http://msdn.microsoft.com/en-us/library/windows/desktop/aa384104(v=vs) 85).aspx –

1

応答ヘッダービットは、空白行でコンテンツから区切られています。

異なる行末を考慮する必要があります。基本的には\rを無視してください。

だから1行目が空白になってから印刷を開始するまで!

EDIT

HTTPヘッダーおよび応答(この場合はHTML)の間に空白行があることを

HTTP/1.1 200 OK 
Date: Fri, 20 Apr 2012 10:19:12 GMT 
... 
Content-Type: text/html 

Hello World 

お知らせは次のようにあなたが応答を持っています。

+0

私は理解していません本当に、もっと説明できますか、問題を指摘してくださいコードで私はそれをより良くしてくれるでしょう – user1341993

+0

上記の応答を参照してください –

+0

どうすればいいですか? – user1341993

関連する問題

 関連する問題