// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <string>

typedef enum
{
    TYPE_NULL,  //XParseURL分析出错,或者地址错误
    TYPE_FTP,
    TYPE_HTTP,
    TYPE_HTTPS,
}URLTYPE;

URLTYPE XParseURL(LPCTSTR lpURL)
{
    int nPort = 0;

    TCHAR lpszHost[1024] = L"0";
    TCHAR lpszObject[1024] = L"0";
    URLTYPE urltype;
    int     nSize = 0;
    int     i;
    TCHAR   lpszURL[1024];
    LPCTSTR lpHttp = _T("http://");
    LPCTSTR lpHttps = _T("https://");
    LPCTSTR lpftp = _T("ftp://");

    lstrcpy(lpszURL, lpURL);

    for (i = 0; i < wcslen(lpszURL); i++)
    {
        if (_T('\\') == lpszURL[i]) lpszURL[i] = _T('/');
    }

    //判断协议
    if (CSTR_EQUAL == CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, lpHttp, lstrlen(lpHttp), lpURL, lstrlen(lpHttp)))
    {
        nSize = lstrlen(lpHttp);
        urltype = TYPE_HTTP;
    }
    else if (CSTR_EQUAL == CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, lpHttps, lstrlen(lpHttps), lpURL, lstrlen(lpHttps)))
    {
        nSize = lstrlen(lpHttps);
        urltype = TYPE_HTTPS;

    }
    else if (CSTR_EQUAL == CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, lpftp, lstrlen(lpftp), lpURL, lstrlen(lpftp)))
    {
        nSize = lstrlen(lpftp);
        urltype = TYPE_FTP;
    }
    else
    {
        urltype = TYPE_NULL;
        return urltype;
    }

    //找页面
    for (i = nSize; i < lstrlen(lpszURL); i++)
    {
        if (_T('/') == lpszURL[i])
        {
            //这里有点小问题
            //if (!lpszObject)
            //{
                lstrcpy((LPWSTR)lpszObject, &lpszURL[i + 1]);
            //};
            lpszURL[i] = 0;
            break;
        }
    }

    //找端口
    for (i = nSize; i < lstrlen(lpszURL); i++)
    {
        if (_T(':') == lpszURL[i])
        {
            if (!nPort)
            {
                nPort = _ttoi(&lpszURL[i + 1]);
            };
            lpszURL[i] = 0;
            break;
        }
    }
    if (lpszHost)
    {
        lstrcpy(lpszHost, &lpszURL[nSize]);
    }

    printf("主机:%ls ,端口:%d ,页面:%ls \n", lpszHost, nPort, lpszObject);

    return urltype;
}

int main()
{
    int i = XParseURL(L"https://www.baidu.com:3389/test/admin.html");

    printf("协议 ");
    //协议判断
    switch (i)
    {
    case 0: printf("NULL \n"); break;
    case 1: printf("ftp \n");  break;
    case 2: printf("http \n");  break;
    case 3: printf("https\n");  break;

    default:

        break;
    }

    return 0;
}

参考

[技术专题] [原创]获取URL中主机域名的小技巧!
http://bbs.pediy.com/thread-179681.htm

【C++】获取URL中主机域名的更多相关文章

  1. Java获取URL中的顶级域名domain的工具类

    方式一: import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; import jav ...

  2. js获取URL中的参数

    js获取URL中的一些参数的意思 location对象 含有当前URL的信息. 属性 href 整个URL字符串. protocol 含有URL第一部分的字符串,如http: host 包含有URL中 ...

  3. 获取url中的参数\+发送ajax请求根路径|+获取复选框的值

    //获取url中的参数function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + "=( ...

  4. 关于获取URL中传值的解决方法

    在我们页面的URL中包含着很多信息,包括域名,协议等等这里就不一一介绍了),对于我们开发者而言,使用比较多的就是页面之间的传值.为什么要页面传值呢?很简单,当你在浏览一个商品页面的时候你要看到一个商品 ...

  5. 使用JavaScript获取url中的参数值

    今天需要用到从url中获取参数,在网上找了几个JavaScript方法,mark下来.   一些可以使用的去获取url中指定的部分:如http://www.mystuff.com.cn/aboutus ...

  6. JS获取url中query_str JavaScript RegExp 正则表达式基础详谈

    面我们举例一个URL,然后获得它的各个组成部分:http://i.cnblogs.com/EditPosts.aspx?opt=1 1.window.location.href(设置或获取整个 URL ...

  7. 获取URL中的某段字符

    1. Location 对象 Location 对象包含有关当前 URL 的信息. Location 对象是 window 对象的一部分,可通过 window.Location 属性对其进行访问. ️ ...

  8. 如何获取url中的参数并传递给iframe中的报表

    在使用报表软件时,用户系统左边一般有目录树,点击报表节点就会在右侧网页的iframe中显示出报表,同时点击的时候也会传递一些参数给网页,比如时间和用户信息等.如何使网页中的报表能够获取到传递过来的参数 ...

  9. 记录一次bug解决过程:velocity中获取url中的参数

    一.总结 在Webx的Velocity中获取url中参数:$rundata.getRequest().getParameter('userId') 在Webx项目中,防止CSRF攻击(Cross-si ...

随机推荐

  1. MT【60】几个不常见的函数图像

    此讲部分内容属于课外阅读拓展,学有余力的可以看看. [We need to know, and we will know.]----大卫·希尔伯特(1862-1943) $y=sin\frac{1}{ ...

  2. MT【58】反演圆和极线极点和谐统一

    解答:如图 评:1.反演圆及其性质介绍: 评2:此题的源头是1995年全国卷压轴题,这里用极线极点的相关性质也可以处理: 注:用相关点法很容易得到轨迹.

  3. 安装 Minio服务

    #MINIO SERVER Minio是在Apache License v2.0下发布的对象存储服务器.它与Amazon S3云存储服务兼容. 它最适合存储非结构化数据,如照片,视频,日志文件,备份和 ...

  4. 【Codeforces 98E】 Help Shrek and Donkey

    http://codeforces.com/problemset/problem/98/E (题目链接) 题意 A君有n张牌,B君有m张牌,桌上还有一张反扣着的牌,每张牌都不一样. 每个回合可以做两件 ...

  5. dij与prim算法

    两种算法本质是相同的. 都是从某一个点开始进行延伸,不断更新一个dis值,直到所有的点都被遍历到,从而求出一个最短路或者是一个树的边权的最小总和. 朴素算法都是n^2,都可以采用堆优化处理,降低复杂度 ...

  6. CF1080

    emmmm......ouuan大佬上紫了,我却没打...... 首先吐槽一波家长会和机房锁门,害我只能来打虚拟赛. 写了abcd四题,还是被ouuan大佬吊打....... 264名,应该能上分吧. ...

  7. 洛谷P3295 萌萌哒 并查集 + ST表

    又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个 ...

  8. centos7部署posgresql和kong总结

    之前在macos系统测试安装psql和kong,但是实际环境中,大部分是部署在linux服务器上.下面记录了在centos7上部署postgresql和kong的总结以及遇到的一些问题的解决. 查看c ...

  9. Gradle 从svn 中检出的父项目后处理配置【我】

    前提: 一个用gradle配置的 类似maven的聚合项目的项目,然后它在svn上就是一个父工程的目录. 检出方式: 在eclipse中,直接用svn资源库检出 父项目 的目录. 然后,在父项目下面的 ...

  10. Xshell配置是vi显示多种颜色

    在链接中,点 File菜单——properties   或按快捷键 alt+p 第一步: Properties--->Terminal 右边的窗口中,将Terminal Type 选择为linu ...