HTTP获取文件和网页内容
2017-04-10 16:21
337 查看
1、解析url地址
2、http协议请求
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; }
相关文章推荐
- 利用cpdetector获取文件编码格式,同时得到网页内容。增加http/https通用方式
- telnet建立http连接获取网页HTML内容
- telnet建立http连接获取网页HTML内容
- vbs+xmlhttp获取网页内容
- VC++获取某个http网页内容
- HttpURLConnection 从网页获取内容与乱码问题解决
- 利用HttpClient获取网页内容
- python3 获取网页内容保存到文件
- httpclient 获取网页内容
- vc 获取网页内容(HTTP)
- HttpClient的get方法获取网页内容
- vc 获取网页内容(HTTP)
- telnet建立http连接获取网页HTML内容
- HttpClient获取网页内容详解
- 利用HttpWebRequest获取网页内容,由于Gzip压缩导致乱码的情况
- http获取网页内容类
- 在android上用HttpURLConnection获取网页内容
- 对http提出Get请求,获取网页内容
- 接口测试(二)httpClient 获取网页内容以及头信息
- java获取网页内容保存到文件