2017-07-26 4 views
0

私はCソケットとウェブサイトhttps://www.000webhost.comにアクセスしようとしている:直接接続をブロックするウェブサイトをバイパスするにはどうすればよいですか?

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

int main(int argc, char** argv) { 
    struct sockaddr_in servaddr; 
    struct hostent *hp; 
    int sock_id; 
    char message[1024*1024]; 
    char request[] = "GET/HTTP/1.1\n" "From: ...\n"; 

    //get a socket 
    if((sock_id = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
     fprintf(stderr,"Couldn't get a socket.\n"); 
     exit(EXIT_FAILURE); 
    }else { 
     fprintf(stderr,"Got a socket.\n"); 
    } 

    memset(&servaddr,0,sizeof(servaddr)); 

    //get address 
    if((hp = gethostbyname("000webhost.com")) == NULL) { 
     fprintf(stderr,"Couldn't get an address.\n"); 
     exit(EXIT_FAILURE); 
    }else { 
     fprintf(stderr,"Got an address.\n"); 
    } 

    memcpy((char *)&servaddr.sin_addr.s_addr, (char *)hp->h_addr, hp->h_length); 

    //port number and type 
    servaddr.sin_port = htons(80); 
    servaddr.sin_family = AF_INET; 

    //connect 
    if(connect(sock_id, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) { 
     fprintf(stderr, "Couldn't connect.\n"); 
    }else { 
     fprintf(stderr,"Got a connection.\n"); 
    } 

    //request 
    write(sock_id,request,strlen(request)); 

    //response 
    read(sock_id,message,1024*1024); 

    fprintf(stdout,"%s",message); 

    return 0; 
} 

私は(したがって、要求からの直接のIPアドレスを削除する)"GET/HTTP/1.1\n" "From: ...\n"から"GET/HTTP/1.1\n" "Host: https://www.000webhost.com" "From: ...\n"request[]配列を変更した場合、私はまだエラーを取得Error 1003. Direct IP access not allowed。要求の一部を修正する必要がありますか?他に何が必要ですか?

+0

要求が不正です。行区切り記号は、\ r \ nでなければなりません。それぞれの単一の行の後。また、HTTP1.1はHostヘッダなしでは絶対に動作しませんので、試してみて、あなたの最善の知識に従った[mcve]を生成してください。 –

答えて

0

リクエストが不正な形式である:

  • 各行は、だけではなく\n\r\nによって終了する必要があります。 (一部のWebサーバーでは\nを手放すことができますが、それが000webhostで動作するかどうかはわかりません)。

  • 各ヘッダーの後に\r\nが必要です。最後の段落で言及した変更されたコードには、Hostヘッダーの末尾に\r\nがありません。

  • Hostヘッダーは、単にホスト名(例:"Host: example.com")である必要があります。 http://は含めないでください。

関連する問題