2012-04-30 6 views
1

このコードはLinuxプラットフォームで作成しました。このプログラムが実行されたとき このCコードはHTTPヘッダーを取得しますが、htmlファイルではありません。

は、それは HTTP headerhtml contentを印刷するように期待していました。 ちょうど好き:

HTTP/1.1 200 OK\r\n 
... 
... 
<!DOCTYPE html> 
... 
</html> 

しかし、私はそれを実行したとき、私はそれだけでこれは私のCコードですHTTP header

を印刷した:

#include <assert.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <netdb.h> // for struct sockaddr_in AF_IN 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> // for inet_pton 
#include <netinet/in.h> // for IPPROTO_TCP 

#define PORT "80" 
#define BAIDU_IP "119.75.217.56" 
#define GET_INFO "GET/HTTP/1.1\r\nHost: www.baidu.com:80\r\n\r\n" 

int main() 
{ 
    int sock_local; 
    in_port_t port = atoi(PORT); 
    struct sockaddr_in server; 

    memset(&server, 0, sizeof(server)); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(port); 

    sock_local = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    assert(sock_local > 0); 

    int retVal = -1; 
    retVal = inet_pton(AF_INET, BAIDU_IP, &server.sin_addr.s_addr); 
    assert(retVal == 1); 

    if (connect(sock_local, (struct sockaddr*)&server, sizeof(server)) < 0) 
    { 
     perror("connect"); 
     exit(EXIT_FAILURE); 
    } 

    ssize_t nByte = send(sock_local, GET_INFO, strlen(GET_INFO), 0); 
    if(nByte <= 0) 
    { 
     perror("send"); 
     exit(EXIT_FAILURE); 
    } 

    char BUF[BUFSIZ]; 
    size_t recived_len = 0; 
    while ((recived_len = recv(sock_local, BUF, BUFSIZ-1, 0)) > 0) 
    { 
     int statu; 
     BUF[recived_len] = '\0'; 
     printf("%s", BUF); 
     statu = (recived_len==BUFSIZ-1) ? 0 : 1; 
     if (statu) break; 
    } 
    if (recived_len < 0) 
    { 
     perror("recv"); 
    } 

    close(sock_local); 
    return 0; 
} 

はあなたがreciveするのに役立つ可能性があり、両方のHTTP headと「HTMLコンテンツ'?

それが作品をdosen'tなぜ私は知りません。

======================ソリューション======================= ======

私は、私は自分自身でこの問題の解決策を見つけた、と言うことは非常にうれしいです。

私はif (statu) break;を削除し、私は期待どおり、それは動作します!

+0

BUFSIZEは、として何を定義していますか? –

+0

BUFSIZは8192として定義されました。HTTPヘッダーには387バイトがあります – thlgood

+0

印刷ヘッダーはどのように見えますか? HTTPの '200'レスポンスコードが返されましたか、それとも別のレスポンスコードですか、別のURLへの3xxリダイレクトですか? –

答えて

3

問題はここのようです:

statu = (recived_len==BUFSIZ-1) ? 0 : 1; 
if (statu) break; 

あなたはこのコードが含まれている理由を私は知りません。以前の読み込み時にバッファを完全に満たさない限り、ループを終了するようです。これを行う理由は何ですか?

これらの2行のコードを削除すると動作するはずです。

(ああ、ところで、それはあなたがどのようにスペルではないのですが、「受け取った」。)

関連する問題