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