2016-03-28 15 views
0

Bir Vikipedi sayfasına yuva programlama ve C++ betiği ile erişmeye çalışıyorum. Sunucuya ulaşabiliyorum, ancak istenen URL'nin mevcut olmadığını bildiren bir 404 hatası alıyorum. Bir tarayıcıda aynı URL’yi girmeniz yeterlidir. http://en.wikipedia.org/wiki/Hypertext_Transfer_ProtocolVikipedi: Vikipedi

Bu C++ script:

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

komut genel çalışıyor

Bu

URL.

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

çizgiyi

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

alışverişi hatasız istenen web sitesini alır. Burada neyi özlüyorum? Komut dosyası neden Wikipedia için çalışmıyor?

Teşekkür

+3

204.27.61.92 nedir? –

+1

Eğer C++ yapıyorsanız, C stili bildirimi yerine const std :: string msg' kullanmak isteyebilirsiniz. Neden "curl" gibi bir kütüphane kullanmak yerine bunu zor yoldan yapıyorsun? – tadman

+1

ve tam olarak hangi hatayı alıyorsunuz? –

cevap

1
  1. bağlandığınız IP adresi wikipedia en değil.
  2. Kodunuz, HTTP 1.1 uyumluluğunu iddia ediyor, ancak yığınlanmış kodlamayı desteklemiyor.
  3. Bir sebepten dolayı isteği iki kez gönderirsiniz.
  4. Sunucunun size veriyi gönderdikten sonra bağlantıyı kapatmasını beklersiniz, ancak sizden istemediniz.
  5. Satır sonlarınız HTTP belirtimiyle uyumlu değil.

Bunun yerine HTTP 1.0'ı uygulamaya çalışarak işleri çok daha kolay hale getirebilirsiniz.

+0

Tüm tavsiye için teşekkürler, David. Bu bana bir adım önde gidiyor. @ 1 Doğru IP adresini girmeliydim. 208.80.153.224 Şimdi farklı bir hata iletisi: Bir bir Vikipedi sunucusu için bir adres var 'HTTP/1.1 301 TLS Yönlendirme Sunucu: Vernik Yer: https://en.wikipedia.org/wiki/ Hypertext_Transfer_Protocol İçerik-Uzunluk: 0 Accept-Aralıkları: Çar, 30 Mar 2016 11:15:42 GMT X-vernik: 4089075905 Yaş: 0 Via: 1.1 vernik Bağlantı: close' mi Tarihi bayt Bunun ne anlama geldiğini ve neyin yanlış olduğunu anlatan bir ipucu var mı? – Ips

+0

@ 2 Bunu nasıl yapacağımı bilmiyorum? Bana yönlendirebileceğiniz örnek kod snippet'i var mı? @ 3 & 4 Bozuk. Bunu gördüğünüz için teşekkürler. @ 5 Bu \ r \ n olur mu? – Ips

+1

Bu mesaj, işlem yapmadığınızdan başka bir şey yapmadığınızı gösteriyor. 301'iniz var, bu bir yönlendirme. Yönlendirmeyi izlemeniz gerekiyor. 2 için, sadece 101 yerine HTTP 1.0 uygulayın. 5 için, evet, tekrar, belirtimi izleyin. –

İlgili konular