C++(Linux) URLのコンテンツをhttpで取得

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
神十国

C++(Linux) URLのコンテンツをhttpで取得

#1

投稿記事 by 神十国 » 14年前

こちらプログラム歴一年になるものです。

下記のプログラムをLINUXで実行しようとすると
sample.cc: In function ‘int main(int, char**)’:
sample.cc:58: error: ‘ur’ was not declared in this scope

というエラーが出ます。
58行目のエラーは変数名が違うまたはインクルード忘れと調べたら出たのですが
がんばっても解決できません。

ご指導お願いします。




#include<iostream>
#include<cstdio>
#include<netdb.h>
#include<errno.h>

using namespace std;

const int cBufferLength= 1024;
extern int errno;

class URL{

private:
string url;

public:
URL(string u){
url = u;
}

public:
string::size_type parseURL(string& host,string& service,string& path){
string::size_type pindex,index;
if(url.find("http://") == string::npos){
return string::npos;
}
host = url.substr(7);
if((pindex = host.find("/")) == string::npos){
return string::npos;
}

path = host.substr(pindex);
host = host.substr(0,pindex);
if((index = host.find(":")) == string::npos){
service = "80";
}else{
service = host.substr(index+1);
host = host.substr(0,index);
}
return pindex;
}

};


int main(int argc,char *argv[])
{
if(argc == 2){
URL ur(argv[1]);
}else{
cerr<<"Usage: "<<argv[0]<<" url"<<endl;
return(1);
}

string host,service,path;
ur.parseURL(host,service,path);

struct addrinfo addrHints;
struct addrinfo *addrInfo;
int errCode;

memset(&addrHints,0,sizeof(addrHints));
addrHints.ai_family = PF_INET;

addrHints.ai_socktype = SOCK_STREAM;

if((errCode = getaddrinfo(host.c_str(),service.c_str(),&addrHints,&addrInfo)) != 0){

cerr<<"getaddrinfo failed for "<<host<<", "<<service<<", ";
cerr<<gai_strerror(errCode)<<endl;
return(2);
}

int connSock;
if((connSock = socket(addrInfo->ai_family,addrInfo->ai_socktype,addrInfo->ai_protocol)) < 0){

cerr<<"failed to open socket"<<strerror(errno)<<endl;
return(3);
}

if((connect(connSock,addrInfo->ai_addr,addrInfo->ai_addrlen)) != 0){

cerr<<"failed to bind socket"<<strerror(errno)<<endl;
return(4);
}

FILE* sockFP;
string request ,workbuf;
char buffer[cBufferLength];
bool output = false;

if((sockFP =fdopen(connSock,"r+")) == NULL ){

cerr<<"failed on opening socket stream"<<endl;
return(5);
}
request = "GET " + path + " HTTP/1.1\r\n";
request += ("Host: " + host +"\r\n");
request += "Connection: close\r\n\r\n";

fputs(request.c_str(),sockFP);

while(fgets(buffer,cBufferLength - 1,sockFP) != NULL){
workbuf = buffer;
if(output){
cout<<buffer;
}
if(workbuf.find("\r\n") == 0){
output = true;
}
}
return(0);
}

神十国

Re: C++(Linux) URLのコンテンツをhttpで取得

#2

投稿記事 by 神十国 » 14年前

最初にこのコードを作って(LINUXで動きます)URL取得のところをオブジェクト化しようとしたら
前のエラーにぶつかりつまずきました。

コード:

#include<iostream>
#include<cstdio>
#include<netdb.h>
#include<errno.h>


using namespace std;

const int cBufferLength= 1024;
extern int errno;

string::size_type
parseURL(string url,string& host,string& service,string& path)
{
        string::size_type pindex,index;
        if(url.find("http://") == string::npos){
                return string::npos;
        }
        host = url.substr(7);
        if((pindex = host.find("/")) == string::npos){
                return string::npos;
        }

        path = host.substr(pindex);
        host = host.substr(0,pindex);
        if((index = host.find(":")) == string::npos){
                service = "80";
        }else{
                service = host.substr(index+1);
                host = host.substr(0,index);
        }
        return pindex;
}

int main(int argc,char *argv[])
{
        string url;
        if(argc == 2){
        url = argv[1];
        }else{
        cerr<<"Usage: "<<argv[0]<<" url"<<endl;
        return(1);
        }

        string host,service,path;
        parseURL(url,host,service,path);

        struct addrinfo addrHints;
        struct addrinfo *addrInfo;
        int errCode;

        memset(&addrHints,0,sizeof(addrHints));
        addrHints.ai_family = PF_INET;

        addrHints.ai_socktype = SOCK_STREAM;

        if((errCode = getaddrinfo(host.c_str(),service.c_str(),&addrHints,&addrInfo)) != 0){

                cerr<<"getaddrinfo failed for "<<host<<", "<<service<<", ";
                cerr<<gai_strerror(errCode)<<endl;
                return(2);
        }

        int connSock;
        if((connSock = socket(addrInfo->ai_family,addrInfo->ai_socktype,addrInfo->ai_protocol)) < 0){

        cerr<<"failed to open socket"<<strerror(errno)<<endl;
        return(3);
        }

                if((connect(connSock,addrInfo->ai_addr,addrInfo->ai_addrlen)) != 0){

        cerr<<"failed to bind socket"<<strerror(errno)<<endl;
        return(4);
        }

        FILE* sockFP;
        string request ,workbuf;
        char buffer[cBufferLength];
        bool output = false;

        if((sockFP =fdopen(connSock,"r+")) == NULL ){

                cerr<<"failed on opening socket stream"<<endl;
                return(5);
        }
        request = "GET " + path + " HTTP/1.1\r\n";
        request += ("Host: " + host +"\r\n");
        request += "Connection: close\r\n\r\n";

                fputs(request.c_str(),sockFP);

        while(fgets(buffer,cBufferLength - 1,sockFP) != NULL){
        workbuf = buffer;
        if(output){
         cout<<buffer;
        }
        if(workbuf.find("\r\n") == 0){
                output = true;
        }
        }
        return(0);
}

non
記事: 1097
登録日時: 14年前

Re: C++(Linux) URLのコンテンツをhttpで取得

#3

投稿記事 by non » 14年前

ifブロック内でオブジェクトを生成しているから、ブロックの外ではスコープ外ということではないでしょうか?
私、C++は初心者のため、Cの変数の感覚ならそうなんですが。
non

神十国

Re: C++(Linux) URLのコンテンツをhttpで取得

#4

投稿記事 by 神十国 » 14年前

ifの外でやったら動きました!


ありがとうございます!

すごく悩んでいたんで本当に助かりました!

閉鎖

“C言語何でも質問掲示板” へ戻る