C++(Linux) URLのコンテンツをhttpで取得
Posted: 2010年12月14日(火) 17:12
こちらプログラム歴一年になるものです。
下記のプログラムを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);
}
下記のプログラムを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);
}