HTTP获取文件和网页内容

这篇博客详细介绍了如何通过HTTP协议获取文件和网页内容。首先解析URL地址,然后利用Winsock库进行TCP连接,发送HTTP GET请求,并接收响应。内容包括设置请求头、建立套接字连接、读取响应数据等步骤。最后,根据需求选择将内容保存为文件或字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值