热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

C++获取URL内容的实例

这篇文章主要介绍了C++获取URL内容的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

我就废话不多说了,大家还是直接看代码吧~

以下内容摘自StackOverFlow 链接

#ifndef HTTPUTIL_H
#define HTTPUTIL_H
#include 
#include 
#include  
using std::string; 
#pragma comment(lib,"ws2_32.lib") 
 
void mParseUrl(char *mUrl, string &serverName, string &filepath, string &filename);
SOCKET connectToServer(char *szServerName, WORD portNum);
int getHeaderLength(char *content);
char *readUrl2(char *szUrl, long &bytesReturnedOut, char **headerOut); 
 
char *sendRequest(char szUrl[]) {
 WSADATA wsaData;
 //char szUrl[] = "http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp";
 long fileSize;
 char *memBuffer, *headerBuffer;
 
 memBuffer = headerBuffer = nullptr;
 
 if (WSAStartup(0x101, &wsaData) != 0)
  return nullptr;
 
 memBuffer = readUrl2(szUrl, fileSize, &headerBuffer);
 printf("returned from readUrl\n");
 printf("data returned:\n%s", memBuffer);
 if (fileSize != 0) {
  //delete (memBuffer);
  delete (headerBuffer);
 }
 WSACleanup();
 return memBuffer;
}
 
void mParseUrl(char *mUrl, string &serverName, string &filepath, string &filename) {
 string::size_type n;
 string url = mUrl;
 
 if (url.substr(0, 7) == "http://")
  url.erase(0, 7);
 
 if (url.substr(0, 8) == "https://")
  url.erase(0, 8);
 
 n = url.find('/');
 if (n != string::npos) {
  serverName = url.substr(0, n);
  filepath = url.substr(n);
  n = filepath.rfind('/');
  filename = filepath.substr(n + 1);
 }
 
 else {
  serverName = url;
  filepath = "/";
  filename = "";
 }
}
 
SOCKET connectToServer(char *szServerName, WORD portNum) {
 struct hostent *hp;
 unsigned int addr;
 struct sockaddr_in server;
 SOCKET conn;
 
 cOnn= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if (cOnn== INVALID_SOCKET)
  return NULL;
 
 if (inet_addr(szServerName) == INADDR_NONE) {
  hp = gethostbyname(szServerName);
 } else {
  addr = inet_addr(szServerName);
  hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET);
 }
 
 if (hp == nullptr) {
  closesocket(conn);
  return NULL;
 }
 
 server.sin_addr.s_addr = *((unsigned long *)hp->h_addr);
 server.sin_family = AF_INET;
 server.sin_port = htons(portNum);
 if (connect(conn, (struct sockaddr *)&server, sizeof(server))) {
  closesocket(conn);
  return NULL;
 }
 return conn;
}
 
int getHeaderLength(char *content) {
 const char *srchStr1 = "\r\n\r\n", *srchStr2 = "\n\r\n\r";
 char *findPos;
 int ofset = -1;
 
 findPos = strstr(content, srchStr1);
 if (findPos != nullptr) {
  ofset = findPos - content;
  ofset += strlen(srchStr1);
 }
 
 else {
  findPos = strstr(content, srchStr2);
  if (findPos != nullptr) {
   ofset = findPos - content;
   ofset += strlen(srchStr2);
  }
 }
 return ofset;
}
 
char *readUrl2(char *szUrl, long &bytesReturnedOut, char **headerOut) {
 const int bufSize = 512;
 char readBuffer[bufSize], sendBuffer[bufSize], tmpBuffer[bufSize];
 char *tmpResult = nullptr, *result;
 SOCKET conn;
 string server, filepath, filename;
 long totalBytesRead, thisReadSize, headerLen;
 
 mParseUrl(szUrl, server, filepath, filename);
 
 / step 1, connect //
 cOnn= connectToServer((char *)server.c_str(), 80);
 
 / step 2, send GET request /
 sprintf(tmpBuffer, "GET %s HTTP/1.0", filepath.c_str());
 strcpy(sendBuffer, tmpBuffer);
 strcat(sendBuffer, "\r\n");
 sprintf(tmpBuffer, "Host: %s", server.c_str());
 strcat(sendBuffer, tmpBuffer);
 strcat(sendBuffer, "\r\n");
 strcat(sendBuffer, "\r\n");
 send(conn, sendBuffer, strlen(sendBuffer), 0);
 
 // SetWindowText(edit3Hwnd, sendBuffer);
 printf("Buffer being sent:\n%s", sendBuffer);
 
 / step 3 - get received bytes 
 // Receive until the peer closes the connection
 totalBytesRead = 0;
 while (1) {
  memset(readBuffer, 0, bufSize);
  thisReadSize = recv (conn, readBuffer, bufSize, 0);
 
  if ( thisReadSize <= 0 )
   break;
 
  tmpResult = (char *)realloc(tmpResult, thisReadSize + totalBytesRead);
 
  memcpy(tmpResult + totalBytesRead, readBuffer, thisReadSize);
  totalBytesRead += thisReadSize;
 }
 
 headerLen = getHeaderLength(tmpResult);
 long cOntenLen= totalBytesRead - headerLen;
 result = new char[contenLen + 1];
 memcpy(result, tmpResult + headerLen, contenLen);
 result[contenLen] = 0x0;
 char *myTmp;
 
 myTmp = new char[headerLen + 1];
 strncpy(myTmp, tmpResult, headerLen);
 myTmp[headerLen] = NULL;
 delete (tmpResult);
 *headerOut = myTmp;
 
 bytesReturnedOut = contenLen;
 closesocket(conn);
 return (result);
}
#endif // HTTPUTIL_H

测试代码:

#include 
#include 
#include "HttpUtil.h"
#include 
using std::string;
using namespace std; 
 
int main() {
 char *resData = sendRequest("http://api.m.taobao.com/rest/api3.do&#63;api=mtop.common.getTimestamp");
 string str = resData;
 cout <

补充知识:C++处理URL的方法,项目有用到,过程记录如下

由于这块需要转换成unicode码,也就是将字符串传换成unicode码,因此需要对输入的字符串做处理,同时又分两种情况,中文 非中文的处理,要区别对待,首先要对输入的字符串进行识别:

int 是不是中文(char *str)
{
char ch;
while (1)
{
ch = *str++;
if (ch == 0)
{
break;
} 
 
if (ch&0x80)
{
if (*str & 0x80)
{
return true;
}
}
else
{
return false;
}
}
return 0;
}

然后要进行相应转换

//--------------------------------------------------------------------- 
//函数:W2C
//功能:将16位wchar_t转换为 8位char[2]
//参数:w_cn为待转换的16位字符,c_cn[]为转换后的8位字符
//备注:wchar_t的高位字节应该存储在char数组的低位字节
//作者:xxxx
//---------------------------------------------------------------------
void W2C(wchar_t w_cn , char c_cn[]){c_cn[0] = w_cn >> 8 ;c_cn[1] = (char)w_cn ;}

然后主体转换代码:

//-------------------------------------------------------------------
//函数:ToHex
//功能:将16位字符串转换为十六进制字符串
//参数:待转换的字符串,字符串长度
//返回值:转换后的字符串
//作者:xxxx
//-------------------------------------------------------------------
CString ToHex(CString Data, long nDataLength)
{
CString sResult;
for (long nLoop=0; nLoop> 4) & 0x0f];
unsigned char chHexB = hex[(unsigned char)(c_cn[i]) & 0x0f];
sResult += (char)chHexA;
sResult += (char)chHexB;
}
}
else
{
sResult += ch;
} 
}
 
return sResult;
}

到这里基本上结束了~也查看了一些资料,虽说这个功能简单,但是过程有点曲折。但总算完成了,留个纪念吧~希望对其他人有帮助~希望大家多多支持。


推荐阅读
  • 地球坐标、火星坐标及百度坐标间的转换算法 C# 实现
    本文介绍了WGS84坐标系统及其精度改进历程,探讨了火星坐标系统的安全性和应用背景,并详细解析了火星坐标与百度坐标之间的转换算法,提供了C#语言的实现代码。 ... [详细]
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
  • 在Kubernetes集群中部署Kuboard
    本文详细介绍了如何在Kubernetes(简称k8s)环境中部署Kuboard,包括必要的命令和步骤,帮助用户顺利完成安装。 ... [详细]
  • 本文介绍并分享了三个个人开源项目,涵盖单元测试中HttpContext的可测试性增强、Visual Studio插件开发以及单元测试报告自动生成工具。 ... [详细]
  • 探讨在构建类似Viber或WhatsApp的聊天应用时,如何有效实现客户端(Web、Android、iOS)与服务器之间的连接。本文将分析使用WebSockets标准及其替代方案的优劣。 ... [详细]
  • 本文详细介绍了如何在 Windows Server 2008 R2 64位操作系统上配置 BugFree 3.0.3 的服务器环境,包括所需软件的安装与配置步骤。 ... [详细]
  • 本文探讨了C++中如何正确使用+运算符来处理字符串和数字的拼接问题,分析了为何某些操作有效而另一些则会引发编译错误。 ... [详细]
  • 本文介绍了两种获取和研究 .NET Framework 源代码的有效途径:一是通过官方提供的下载链接获取完整源代码,并使用 Visual Studio 进行本地查看;二是利用在线资源平台,直接在网页上浏览源代码。 ... [详细]
  • 在Win10上利用VS2015构建Caffe2环境
    本文详细介绍如何在Windows 10操作系统上通过Visual Studio 2015编译Caffe2深度学习框架的过程。包括必要的软件安装、环境配置以及常见问题的解决方法。 ... [详细]
  • 本文介绍了如何使用命令行在 Windows 系统中启动或关闭 VMWare 的关键服务,包括 VMwareHostd、VMAuthdService、VMUSBArbService、VMware NAT Service 和 VMnetDHCP。 ... [详细]
  • 本文详细介绍了如何在两台运行 Windows Server 2003 的计算机上配置两个 MySQL 实例以实现主从复制。每台计算机分别命名为 Master 和 Slave,确保系统分区及 MySQL 安装路径的正确配置。 ... [详细]
  • 解决ASP.NET Core在IIS中出现的502.5进程失败错误
    本文详细探讨了在Windows Server 2012环境下安装.NET Core后,IIS站点出现502.5错误的原因及解决方案,包括重启服务和系统的方法。 ... [详细]
  • 本文详细介绍了如何在 Windows 7 操作系统上安装和配置 InfluxDB,这是一种专为处理时间序列数据设计的高性能数据库。 ... [详细]
  • 本文整理了一系列Java面试问题,涵盖Java开发环境的分类、Java语言的核心特性、Linux环境下Java SE的安装步骤、常用的Java开发工具介绍,以及类与对象的基本概念等。 ... [详细]
  • 题目描述了一个病毒检测问题,要求使用AC自动机算法统计目标文本中多个模式串的出现次数。 ... [详细]
author-avatar
渊博的大盗zhang_618
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有