您的位置:首页 > 理论基础 > 计算机网络

HTTP获取文件和网页内容

2017-04-10 16:21 337 查看
1、解析url地址
string HlsParser::GetXml(string epgaddr)
{
if (epgaddr.empty())
return "";

string strXML = "";
string uri;

uri.append(epgaddr.c_str());
string::size_type index;//无符号整型
string path;
string port;
string host;
//npos 是一个常数,用来表示不存在的位置,取值由实现决定,一般是-1
if (string::npos == uri.find("http://"))
{
index = uri.find(":");
host = uri.substr(0, index);
string temp = uri.substr(index);
index = temp.find("/");
port = temp.substr(1, index - 1);
path = temp.substr(index);
}
else
{
string temp = uri.substr(strlen("http://"));
index = temp.find(":");
host = temp.substr(0, index);
string temp2 = temp.substr(index);
index = temp2.find("/");
port = temp2.substr(1, index - 1);
path = temp2.substr(index);
}
//printf("url %s\n host %s port %s path %s\n", epgaddr.c_str(), host.c_str(), port.c_str(), path.c_str());

strXML = GetHttpFile(host.c_str(), port.c_str(), path.c_str(), "");

return strXML;
}


2、http协议请求
string HlsParser::GetHttpFile(const char*host, const char* port, const char* file, const char* savefile)
{
string strTemp = "";
string strFile = "";
stringstream stream;
WORD wVersionRequested;
WSADATA wsaData;
int err;
int iResult;
SOCKET socketclient;
struct addrinfo hints;
struct addrinfo *res;

wVersionRequested = MAKEWORD(2, 2);//初始化版本号
err = WSAStartup(wVersionRequested, &wsaData);//创建套接字
if (err !=0)
return "";

if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)//校验版本号
{
WSACleanup();
return "";
}

memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;

iResult = getaddrinfo(host, port, &hints, &res);//主机名到地址解析
if (iResult != 0)
return "";

socketclient = socket(res->ai_family, res->ai_socktype, res->ai_protocol);//创建socket
if (socketclient < 0)
return "";

iResult = connect(socketclient, res->ai_addr, res->ai_addrlen);//连接
if (iResult != 0)
return "";

freeaddrinfo(res);

stream << "GET " << file << " HTTP/1.1\r\n"
<< "Accpet: */*\r\n"
<< "Host: " << host << "\r\n"
<< "\r\n";

string request = stream.str();
send(socketclient, request.c_str(), request.size(), 0);//发送http请求协议头

char buf[1024];
memset(buf, 0, 1024);
int rc;
//int timeout = 20000; ///0.5 second
//setsockopt(socketclient, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(int));
///Here something is wrong, when recv size is 1024, wait for ever?
if (strlen(savefile) != 0)//保存成文件
{
ofstream outputFile;
outputFile.open(savefile, ios::out | ios::binary);
while ((rc = recv(socketclient, buf, 1024, 0)) > 0)
{
//printf("bin %d count\n", rc);
outputFile.write(buf, rc);
memset(buf, 0, 1024);
};
outputFile.close();
}
else//保存成字符串
{
while ((rc = recv(socketclient, buf, 1024, 0)) > 0)
{
//printf("%d count\n", rc);
strTemp.append(buf, rc);
if (rc < 1024)
break;
memset(buf, 0, 1024);
};
}

closesocket(socketclient);//关闭socket
WSACleanup();//关闭套接字

int index = 0;
if (strTemp.find("HTTP/1.1 200 OK") == 0)
{
index = strTemp.find("\r\n\r\n");
strFile = strTemp.substr(index + 4);
}
else
{
return strTemp;
}

return strFile;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: