2016-03-28 16 views
0

ソケットプログラミングとC++スクリプトを使用してWikipediaページにアクセスしようとしています。サーバーにアクセスできますが、要求されたURLが存在しないことを通知する404エラーが表示されます。ブラウザで同じURLを入力するだけで問題ありません。 http://en.wikipedia.org/wiki/Hypertext_Transfer_ProtocolWikipediaへのHTTPリクエスト

これはC++のスクリプトは次のとおりです:

#include <iostream> 
#include <sys/socket.h> 
#include <resolv.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    int s, error; 
    char length[10]; 
    length[0]=0;  

    struct sockaddr_in addr; 

    if((s = socket(AF_INET,SOCK_STREAM,0))<0) 
    { 
     cout<<"Error 01: creating socket failed!\n"; 
     close(s); 
     return 1; 
    } 

    addr.sin_family = AF_INET; 
    addr.sin_port = htons(80); 
    inet_aton("204.27.61.92",&addr.sin_addr); 

    error = connect(s,(sockaddr*)&addr,sizeof(addr)); 
    if(error!=0) 
    { 
     cout<<"Error 02: conecting to server failed!\n"; 
     close(s); 
     return 1; 
    } 

    char msg[]="GET /wiki/Hypertext_Transfer_Protocol HTTP/1.1\nHOST: en.wikipedia.org\n\n" 

    int leng = send(s, msg, sizeof(msg), 0); 

    if(leng == -1) 
     cout<<"There is a problem!"<<endl; 

    send(s,msg,sizeof(msg),0); 

    char answ[1024]; 

    ssize_t len; 
    while((len = recv(s, answ, 1024, 0)) > 0) 
    { 
     cout.write(answ, len); 
    } 
    cout << endl; 

    if(len < 0) 
    { 
     cout<<"Error!"<<endl; 
    } 

    close(s); 

    return 0; 
} 

スクリプトは、全体的な正常に動作

この

はURLです。

char msg[] = "GET /beej/inet_ntoaman.html http/1.1\nHOST: retran.com\n\n"; 

でライン

char msg[]="GET /wiki/Hypertext_Transfer_Protocol HTTP/1.1\nHOST: en.wikipedia.org\n\n"; 

を交換すると、エラーなしで要求されたWebサイトを検索します。私はここで何が欠けていますか?なぜスクリプトはWikipediaで動作しないのですか?

おかげ

+3

204.27.61.92とは何ですか? –

+1

C++を実行している場合は、Cスタイル宣言の代わりに 'const std :: string msg'を使用するとよいでしょう。なぜあなたは 'curl'のようなライブラリを使うのではなく、これを難しい方法でやっていますか? – tadman

+1

あなたは正確にどのようなエラーになっていますか? –

答えて

1
  1. あなたは接続先のIPアドレスは、ウィキペディアのではありません。
  2. コードでHTTP 1.1準拠が要求されていますが、チャンクエンコーディングはサポートされていません。
  3. 何らかの理由でリクエストを2回送信します。
  4. データを送信した後にサーバーが接続を閉じることを期待しているように見えますが、要求していません。
  5. あなたの行末はHTTP仕様に準拠していません。

代わりにHTTP 1.0を実装しようとすると、簡単に作業を進めることができます。

+0

すべてのアドバイスをありがとう、デイビッド。これは一歩前進しています。 @ 1正しいIPアドレスを入力してください。 208.80.153.224 は今、私は別のエラーメッセージが表示されます:私は、ウィキペディアのサーバのアドレスを持って 'HTTP/1.1 301 TLSリダイレクト サーバー:ニス 場所:https://en.wikipedia.org/wiki/ Hypertext_Transfer_Protocol のContent-Length:0 は、範囲を受け入れ:バイト 日:水曜日、2016年3月30日午前11時15分42秒GMT X-ニス:4089075905 年齢:0 ビア:1.1ニス 接続:close' はあなたを行いますそれが何を意味し、何が間違っているのかという手掛かりがありますか? – Ips

+0

@ 2これを行う方法がわかりません。あなたが私に参照できるサンプルコードのスニペットがありますか? @ 3&4悪いです。これを見つけていただきありがとうございます。 @ 5これは\ r \ nでしょうか? – Ips

+1

このメッセージは、あなたが間違っていたことを示すものではありません。あなたには301があります。これはリダイレクトです。あなたはリダイレクトに従う必要があります。 2の場合は、101ではなくHTTP 1.0を実装します.5の場合は、もう一度、仕様に従います。 –

関連する問題