C/C++ 实现URL路径拆分
URL路径拆分: 例如我们传入 http://www.baidu.com/index.php 拆分为 www.baidu.com 和 /index.php
#include <Windows.h>
#include <iostream>
int ParseUrl(char szUrl[], char szHost[], char szPath[])
{
int iStart = 0;
int iEnd = 0;
int iLen = 0;
if (strncmp(szUrl, "http://", 7) == 0)
iStart = 7;
else if (strncmp(szUrl, "https://", 8) == 0)
iStart = 8;
while (szUrl[iStart + iLen] != '\0' && szUrl[iStart + iLen] != '/')
{ iLen++; }
memcpy(szHost, szUrl + iStart, iLen);
if (strlen(szUrl) - iStart - iLen == 0)
szPath[0] = '/';
else
memcpy(szPath, szUrl + iStart + iLen, strlen(szUrl) - iStart - iLen);
return 0;
}
int main(int argc,char *argv [])
{
char szUrl[] = "http://www.baidu.com/index.html";
char szHost[1024] = { 0 };
char szPath[2048] = { 0 };
int ret = ParseUrl(szUrl,szHost,szPath);
if (ret == 0)
{
printf("主机: %s \n", szHost);
printf("路径: %s \n", szPath);
}
system("pause");
return 0;
}
http 文件下载
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <iostream>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")
int Spide(const char *pszUrl, const char *pszFile)
{
char szHost[256] = {0};
char *ptr = (char *)pszUrl;
// 判断开头是否为http://如果不是则返回-1
if (_strnicmp(ptr, "http://", 7) != 0) { return -1; }
ptr = ptr + 7;
int index = 0;
while (index < 255 && *ptr && *ptr != '/')
{
szHost[index++] = *ptr++;
}
szHost[index] = '\0';
//printf("去掉http后的域名地址: %s \n", szHost);
char *buffer = new char[1024 * 8];
index = sprintf(buffer,
"GET %s HTTP/1.1\r\n"
"Host: %s\r\n"
"User-Agent: IE or Chrome\r\n"
"Accept-Type: */*\r\n"
"Connection: Close\r\n\r\n",
ptr, szHost);
//printf("构建好的请求头:\n %s \n", buffer);
// ------------------------------------------------------------
SOCKET fd = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr = 0;
addr.sin_port = htons(0);
addr.sin_family = AF_INET;
index = bind(fd, (const sockaddr*)&addr, sizeof(SOCKADDR_IN));
hostent *p = ::gethostbyname(szHost);
if (p) {
ULONG ai = *(ULONG*)p->h_addr_list[0];
addr.sin_addr.S_un.S_addr = ai;
addr.sin_port = htons(80);
index = connect(fd, (const sockaddr*)&addr, sizeof(SOCKADDR_IN));
if (index == NOERROR) {
index = send(fd, (const char*)buffer, (int)strlen(buffer), 0);
FILE *pf = fopen(pszFile, "wb");
do {
index = recv(fd, buffer, 8191, 0);
if (index <= 0) {
break;
}
buffer[index] = '\0';
fwrite(buffer, 1, index, pf);
printf("%s", buffer);
} while (TRUE);
fclose(pf);
}
}
closesocket(fd);
delete[] buffer;
return 0;
}
int main(int argc,char *argv[])
{
WSADATA wsaData;
WSAStartup(0x0202, &wsaData);
Spide("http://cn.bing.com/","index.html");
system("pause");
return 0;
}
实现HTTP页面下载功能
#include <Windows.h>
#include <iostream>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")
int Curl_Get(const char *pszUrl)
{
char szHost[256] = { 0 };
char *ptr = (char *)pszUrl;
// 判断开头是否为http:// 或者 https:// 如果不是则返回-1
if (_strnicmp(ptr, "http://", 7) == 0)
ptr = ptr + 7;
else if (_strnicmp(ptr, "https://", 8) == 0)
ptr = ptr + 8;
else
return -1;
int index = 0;
while (index < 255 && *ptr && *ptr != '/')
szHost[index++] = *ptr++;
szHost[index] = '\0';
char *buffer = new char[1024 * 8];
index = sprintf(buffer,
"GET %s HTTP/1.1 \r\n"
"Host: %s \r\n"
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0 \r\n"
"Accept-Type: */* \r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 \r\n"
"Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 \r\n"
"Connection: Close \r\n\r\n",
ptr, szHost);
printf("%s \n", buffer);
SOCKADDR_IN addr;
SOCKET fd = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_addr.S_un.S_addr = 0;
addr.sin_port = htons(0);
addr.sin_family = AF_INET;
index = bind(fd, (const sockaddr*)&addr, sizeof(SOCKADDR_IN));
hostent *p = gethostbyname(szHost);
if (p)
{
ULONG ai = *(ULONG*)p->h_addr_list[0];
addr.sin_addr.S_un.S_addr = ai;
addr.sin_port = htons(80);
index = connect(fd, (const sockaddr*)&addr, sizeof(SOCKADDR_IN));
if (index == NOERROR)
{
index = send(fd, (const char*)buffer, (int)strlen(buffer), 0);
do
{
index = recv(fd, buffer, 8191, 0);
if (index <= 0) { break; }
buffer[index] = '\0';
printf("%s \n", buffer);
} while (TRUE);
}
}
closesocket(fd);
return 0;
}
int main(int argc, char *argv[])
{
WSADATA wsaData;
WSAStartup(0x0202, &wsaData);
Curl_Get("http://cn.bing.com/");
WSACleanup();
system("pause");
return 0;
}
C/C++ 实现URL路径拆分的更多相关文章
- urllib.parse:很底层,但是是一个处理url路径的好模块
介绍 urllib.parse是为urllib包下面的一个模块,urllib的其它模块完全可以使用requests替代.但是urlli.parse我们是有必要了解的,因为该模块下面有很多操作url路径 ...
- django url路径与模板中样式相对路径的问题
static目录下有css和js及image等文件夹,里面放置网站的一些静态文件,static位于网站根目录下,django中配置静态文件这个就细说,网上都有,昨天在添加新内容时发现一个问题,我的ur ...
- paip.解决中文url路径的问题图片文件不能显示
paip.解决中文url路径的问题图片文件不能显示 #现状..中文url路径 图片文件不能显示 <img src="img/QQ截图20140401175433.jpg" w ...
- SVN 修改URL路径
http://strugglelinux.blog.51cto.com/1009905/672008 标签:休闲 SVN 修改URL路径 职场 原创作品,允许转载,转载时请务必以超链接形式标明文章 原 ...
- JS分页 + 获取MVC地址栏URL路径的最后参数
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...
- jsp中如何获得url路径和绝对路径
jsp中如何获得url路径 request.getHeader("referer") JSP中获得当前应用的相对路径和绝对路径 根目录所对应的绝对路径:request.getReq ...
- Spring—请求映射之URL路径映射
Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义我们的处理器类.并且提供了一组强大的注解:需要通过处理器映射DefaultAnnotati ...
- Javaweb开发中URL路径的使用
看到博客园孤傲苍狼的web系列文章中有关于URL路径的使用文章后,感觉自己对URL的使用清楚了很多,自己再对着动手写一遍以加深记忆. JavaWeb开发中常看到URL以"/"开头, ...
- url路径去掉两个opencms
采用刚刚的方法安装OpenCMS之后,站点url中会存在两个opencms,造成访问url路径过长,下面讲解一种去掉两个opencms的方法. 1.去掉第一个opencms 安装时采用ROOT安装,即 ...
- 根据url路径获取图片并显示到ListView中
项目开发中我们需要从网络获取图片显示到控件中,很多开源框架如Picasso可以实现图片下载和缓存功能.这里介绍的是一种简易的网络图片获取方式并把它显示到ListView中. 本案例实现的效果如下: 项 ...
随机推荐
- 记录一次Java内存泄露分析过程
版权说明: 本文章版权归本人及博客园共同所有,转载请在文章前标明原文出处( https://www.cnblogs.com/mikevictor07/p/13032635.html ),以下内容为个人 ...
- 深入探索Android 启动优化(七) - JetPack App Startup 使用及源码浅析
本文首发我的微信公众号:徐公,想成为一名优秀的 Android 开发者,需要一份完备的 知识体系,在这里,让我们一起成长,变得更好~. 前言 前一阵子,写了几篇 Android 启动优化的文章,主要是 ...
- ElasticSearch 分组聚合统计
统计总数: GET mytest-statistics/_search { "size": 0, "query": { "bool": { ...
- 【3rd Party】nlohmann json 基础用法
参考链接:Here 什么是nlohman json ? nlohman json GitHub - nlohmann/json: JSON for Modern C++ 是一个为现代C++(C++11 ...
- go 接口学习笔记
这里是对接口在汇编层面上转换和实现的小结,详细了解可参考 Go 语言接口的原理 1. 类型转换:结构体到接口 1.1 结构体方法实现接口 package main type Duck interfac ...
- 基于java+springboot的商城网站、电子商城管理系统
该系统是基于java+springboot+vue开发的在线商城网站.是给师弟开发的课程作业.学习过程中,遇到问题可以咨询作者. 演示地址 前台地址: http://shop.gitapp.cn 后台 ...
- std::istringstream的用法
1.概要 std::istringstream 是 C++ 标准库中的一个类,它用于从字符串中提取数据,并将数据转换为不同的数据类型.它通常用于从字符串中解析数据,例如整数.浮点数等.以下是关于 st ...
- pybind11
fatal error: Python.h: no such file or directory 在使用pybind11时,如果不做调整可能就会出现这样的情况,Python.h一般出现在usr/inc ...
- [转帖]KV数据库调研
https://zhuanlan.zhihu.com/p/499313638 Redis作为NoSQL领域的代表,拥有很高的读写性能,支持比较丰富的数据类型,但是Redis也存在一些缺陷. l 内存数 ...
- [转帖]Shell 脚本实现应用服务日志入库 Mysql
今天给大家分享一个 shell 脚本工具,通过 shell 脚本与 mysql 的结合,将某个具体服务的错误输出日志入库到指定的 mysql 表中,以便于进行错误问题的定位与分析. 日常工作中,经常需 ...