[转]URL的解析,C语言实现
http://blog.csdn.net/cuishumao/article/details/10284463
一 说明
(1)应用情况:比如基于socket来实现http协议等,这时候就需要解析URL。
(2)为了移植性,没有用非标准C库windows下的StrDup(linux下为strdup),用自己编写的dup_str。
(3)编译环境:windows ,visual studio2010
二 URL的格式:
(协议)://(主机名):(端口号) / (文件路径)/(文件名)
例如:http://zj.qq.com/a/20130824/002507.htm#p=8
http://www.itpub.net/kwrss/201211/wangzhiduankou.shtml
三 实现
- #include <stdio.h> //printf
- #include <string.h> //strchr strncmp ,memcpy
- #include <malloc.h> //malloc free
- #include <stdlib.h> //atoi
- //将source开始空间的以NULL结尾的字符拷贝到dest中
- //返回的指针需要free
- char*dup_str(const char*source)
- {
- if(source==NULL)
- return NULL;
- int len = strlen(source);
- char *dest = (char*)malloc(len+1);
- memcpy(dest,source,len+1);
- return dest;
- }
- //函数功能:解析URL
- //参数:host带回主机字符串,protocl协议,port端口,abs_path带回绝对路径
- //使用完注意释放host和abs_path在堆上分配的内存
- //备注:(1)先取到URL的一份拷贝,方面将该字符串截成几段,分别处理;
- // (2)用了指针引用,也可以使用二重指针来解决参数带回值的问题
- void parse_URL(const char*URL,const char*protocl,char*&host,unsigned int &port,char*&abs_path)
- {
- if(URL == NULL)
- return ;
- char *url_dup = dup_str(URL);
- char *p_slash = NULL;//主机后第一个斜杠的位置
- char *p_colon = NULL;//主机后第一个冒号的位置
- char *start = 0; //记录www开始的位置
- if(strncmp(url_dup,protocl,strlen(protocl))==0)
- {
- start = url_dup+strlen(protocl)+3;
- p_slash = strchr(start,'/');
- if(p_slash != NULL)
- {
- abs_path= dup_str(p_slash);
- *p_slash = '\0';
- }
- else
- {
- abs_path= dup_str("/");
- }
- p_colon = strchr(start,':');
- if(p_colon != NULL)
- {
- port = atoi(p_colon+1);
- *p_colon = '\0';
- }
- else
- port = 8080;//没有的话取默认的8080端口
- }
- host = dup_str(start);
- }
- if(url_dup != NULL)
- {
- free(url_dup);
- url_dup = NULL;
- }
- }
- int main()
- {
- //这是一个伪造的地址,用于测试
- //char *URL = "http://www.xyz2013.com";
- //char *URL = "ftp://www.xyz2013.com:8080";
- char *URL = "https://www.xyz2013.com:1324/My/5201449.shtml";
- char*abs_path = NULL;
- char*host = NULL;
- unsigned int port;
- parse_URL(URL,"https",host,port,abs_path);
- printf("主机地址:%s\n",host);
- printf("端口号:%d\n",port);
- printf("绝对路径:%s\n",abs_path);
- //需要释放host,abs_path
- if(host!=NULL)
- {
- free(host);
- host = NULL;
- }
- if(abs_path!=NULL)
- {
- free(abs_path);
- abs_path=NULL;
- }
- getchar();
- }
结果:
[转]URL的解析,C语言实现的更多相关文章
- URL的解析,C语言实现
源: URL的解析,C语言实现 c语言实现urlencode和decode
- 巨蟒python全栈开发django4:url反向解析图解&&模板渲染
第一部分: 1.(1)知识点回顾: django回顾: ()下载安装 输入网址,a,form表单get post,爬虫 (请求)==>django项目服务端的url(r"index/& ...
- python 之 Django框架(路由系统、include、命名URL和URL反向解析、命名空间模式)
12.36 Django的路由系统 基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名) ...
- phpcms V9 MVC模式 与 URL访问解析
[1]URL访问解析 观察访问网页时的网址,可以得出模块访问方法,如下示例: http://www.abcd.com.cn/phpcms/index.php?m=content&c=index ...
- atitit.java解析sql语言解析器解释器的实现
atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...
- phpcms(1)phpcms V9 MVC模式 与 URL访问解析(转)
[1]URL访问解析 观察访问网页时的网址,可以得出模块访问方法,如下示例: http://www.abcd.com.cn/phpcms/index.php?m=content&c=index ...
- django的url反向解析
目的:防止页面中url地址改变,其他与这个URL地址有关联的都要改,减少耦合度 使用:主要分为在html中和视图函数中的使用 HTML中的使用: 如果我们在项目的url文件中通过include导入了应 ...
- Django url配置 正则表达式详解 分组命名匹配 命名URL 别名 和URL反向解析 命名空间模式
Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11版本 ...
- Django url反向解析与路由分发名称空间
url反向解析 url.py from django.conf.urls import url from django.contrib import admin from app01 import v ...
- rails中path、url路径解析,routes信息,form_for剖析,link_to示例,路由实例说明
原创,转载请注明http://www.cnblogs.com/juandx/p/3963023.html rails中path.url路径解析,routes信息,form_for剖析,link_to ...
随机推荐
- Liferay的架构:缓存(第一部分)
这次,我将要涉及到一个非常重要的概念:缓存.在当今的web应用中,如果没有设计一个比较好的缓存系统,在web中就不可能有一个良好的性能.所以我将要 提到的缓存不仅仅能够更好地理解Liferay架构,而 ...
- JVM执行引擎的执行过程
摘自深入分析java web技术内幕
- 爬虫关于ip管理池的应用
在爬虫的时候经常会遇到一个问题就是ip被封,由于ip对网站的短时间大量请求,让网站将我们的ip暂时封掉.这样我们就无法全部爬取自己想要的内容. 这里百度了一下解决办法,很多人都提到了ip代理管理池的问 ...
- [Angular Directive] Assign a Structual Directive a Dynamic Context in Angular 2
Just like passing in an array to *ngFor, you can pass in any value into your structural directive s ...
- AsyncTask兼容性
简介 AsyncTask是Android系统提供的异步方式,其优点在于在子线程执行任务,并将结果传递给主线程. 实现方式 AsyncTask封装了Executor和Handler. 基本使用 通过As ...
- Redmine管理项目3-调整用户显示格式
在 Redmine 中新建用户时是这样的: 必须指定姓氏.名字,然后 Redmine 默认是按“名字 姓氏”这种方式显示用户.比如“张三”,会显示成“三张”……看起来好别扭啊. 怎么调整呢,参看 Re ...
- 关于元素加上margin属性后以谁为基准移动的问题及负margin的问题
突然想起这个问题,这是很基础很基础的问题啊,但之前很多次都忘记了,然后困扰了我很久.不清不楚的感觉很不好,所以要做成笔记比较好记住,好记性不如烂笔头,以后再次困惑了再回来看看.推荐文章,海玉的< ...
- angularjs过滤器(一)------禁止转载------
如果用代码实现:将new Date()转换为 M/D/YY 00:00 格式. 启用过滤器有两种方式:①在HTML中用"|"启用过滤器.格式为{{$scope.property | ...
- Java线程如何返回数据
前言 当开发者从单线程开发模式过渡到多线程环境,一个比较棘手的问题就是如何在一个线程中返回数据,众所周知,run()方法和start()方法不会返回任何值. 笔者在学习<Java Network ...
- iOS 手势识别
首先给大家解释一下为什么要学习手势识别? 如果想监听一个UIView上面的触摸事件,之前的做法是: 自定义一个UIView : 实现UIView的touches方法,在方法里面实现具体功能 透过tou ...