域名解析及HTTP

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析DNS,个人版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 域名解析及HTTP

文章目录

域名解析

代码示例

超文本传输协议(HTTP)

代码示例

正则表达式

代码示例


域名解析

URL:统一资源定位符

http://www.sina.com.cn/web/index.html


  • http:// - 协议
  • www.sina.com.cn - 域名
  • /web/index.html - 路径

DNS - 域名解析服务

www.sina.com.cn -> 202.60.121.55, ...
...
#include <netdb.h>
struct hostent* gethostbyname (char const* name);
返回主机条目信息结构指针,失败返回NULL。
hostent
     h_name - 字符指针,指向主机官方名字符串
     h_aliases - 指向字符指针数组的指针,该数组中的每个元素都是字符指针,指向一个别名字符串,最后一个元素是一个NULL指针
     h_addrtype - 地址类型,AF_INET(IPv4)
     h_length - 地址字节数, 4字节(IPv4)
     h_addr_list - 指向结构体指针数组的指针,该数组中的每个元素都指向一个struct in_addr类型的结构体,其中存放着主机一个IP地址,最后一个元素是一个空指针
#include <arpa/inet.h>
char* inet_ntoa (struct in_addr addr);


代码示例

  • dns.c
#include <netdb.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char* argv[]) {
  if (argc < 2) {
  printf ("用法:%s <主机域名>\n",
    argv[0]);
  return EXIT_FAILURE;
  }
  struct hostent* host =
  gethostbyname (argv[1]);
  if (! host) {
  perror ("gethostbyname");
  return EXIT_FAILURE;
  }
  if (host->h_addrtype == AF_INET) {
  printf ("主机官方名:\n");
  printf ("\t%s\n", host->h_name);
  printf ("主机别名表:\n");
  char** pp = host->h_aliases;
  while (*pp)
    printf ("\t%s\n", *pp++);
  printf ("主机地址表:\n");
  struct in_addr** pa =
    (struct in_addr**)
    host->h_addr_list;
  while (*pa)
    printf ("\t%s\n",
    inet_ntoa (**pa++));
  }
  return EXIT_SUCCESS;
}


  • 执行结果

2020020817370426.png

超文本传输协议(HTTP)

  1. 请求
GET /web/index.html HTTP/1.0<CR><NL>
Host: www.sina.com.cn
Accept: */*
Connection: Close/Keep-Alive
User-Agent: Mozilla/5.0
Referer: www.sina.com.cn<CR><NL><CR><NL>

  1. 响应
HTTP/1.0 200 OK
Server: nginx
Date: Wed, 26 Oct 2016 10:52:04 GMT
Content-Type: text/html;charset=UTF-8
Content-length: 1234
Connection: Close/Keep-Alive<CR><NL><CR><NL>
<html>
<head> ... </head>
<body> ... </body>
</html>


代码示例

  • http.c
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <strings.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char* argv[]) {
  if (argc < 3) {
  printf ("用法:%s <主机地址> "
    "<主机域名> [<资源路径>]\n",
    argv[0]);
  return EXIT_FAILURE;
  }
  char const* ip = argv[1];
  char const* domain = argv[2];
  char const* path = argc < 4 ?
  "" : argv[3];
  int sockfd = socket (PF_INET,
  SOCK_STREAM, 0);
  if (sockfd == -1) {
  perror ("socket");
  return EXIT_FAILURE;
  }
  struct sockaddr_in addr;
  bzero (&addr, sizeof (addr));
  addr.sin_family = AF_INET;
  addr.sin_port = htons (80);
  if (! inet_aton (ip,
  &addr.sin_addr)) {
  perror ("inet_aton");
  return EXIT_FAILURE;
  }
  if (connect (sockfd,
  (struct sockaddr*)&addr,
  sizeof (addr)) == -1) {
  perror ("connect");
  return EXIT_FAILURE;
  }
  char request[1024];
  sprintf (request,
  "GET /%s HTTP/1.0\r\n"
  "Host: %s\r\n"
  "Accept: */*\r\n"
  "Connection: Close\r\n"
  "User-Agent: Mozilla/5.0\r\n"
  "Referer: %s\r\n\r\n",
  path, domain, domain);
  if (send (sockfd, request,
  strlen (request), 0) == -1) {
  perror ("send");
  return EXIT_FAILURE;
  }
  for (;;) {
  char respond[1024] = {};
  ssize_t rlen = recv (sockfd,
    respond,
    sizeof (respond) - 1, 0);
  if (rlen == -1) {
    perror ("recv");
    return EXIT_FAILURE;
  }
  if (! rlen)
    break;
  printf ("%s", respond);
  }
  printf ("\n");
  close (sockfd);
  return EXIT_SUCCESS;
}


  • 执行结果

2020020817535817.png

正则表达式

包含头文件


#include <regex.h>


  • regcomp - 编译正则表达式
  • regexec - 执行正则匹配
  • regfree - 释放正则表达式内存
... href=" http://www.sina.com.cn/web/index.html " ...
href="\s*\([^ >"]*\)\s*"
\s - 匹配任意空白字符(空格、制表、回车、换行)
* - 重复前一个匹配项任意次
[^ >"] - 匹配任意除空格大于号双引号以外的字符
\(和\) - 定义子表达式


代码示例

  • regex.c
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char* argv[]) {
  if (argc < 2) {
  printf ("用法:%s <HTML文件>\n",
    argv[0]);
  return EXIT_FAILURE;
  }
  FILE* fp = fopen (argv[1], "r");
  if (! fp) {
  perror ("fopen");
  return EXIT_FAILURE;
  }
  if (fseek (fp, 0, SEEK_END) == -1) {
  perror ("fseek");
  return EXIT_FAILURE;
  }
  long size = ftell (fp);
  if (size == -1) {
  perror ("ftell");
  return EXIT_FAILURE;
  }
  char* buf= (char*)malloc (size + 1);
  if (! buf) {
  perror ("malloc");
  return EXIT_FAILURE;
  }
  if (fseek (fp, 0, SEEK_SET) == -1) {
  perror ("fseek");
  return EXIT_FAILURE;
  }
  if (fread (buf, 1, size, fp)!=size) {
  perror ("fread");
  return EXIT_FAILURE;
  }
  buf[size] = '\0';
  fclose (fp);
  regex_t ex;
  int error = regcomp (&ex,
  "href=\"\\s*\\([^ >\"]*\\)\\s*\"",0);
  if (error) {
  char errInfo[1024];
  regerror (error, &ex, errInfo,
    sizeof (errInfo));
  printf ("regcomp: %s\n",
    errInfo);
  return EXIT_FAILURE;
  }
  char const* html = buf;
  regmatch_t match[2];
  while (regexec (&ex, html, 2, match,
  0) != REG_NOMATCH) {
  html += match[1].rm_so;
  size_t len = match[1].rm_eo -
    match[1].rm_so;
  char* url = (char*)malloc (
    len + 1);
  memcpy (url, html, len);
  url[len] = '\0';
  printf ("%s\n", url);
  free (url);
  html += len + match[0].rm_eo -
    match[1].rm_eo;
  }
  regfree (&ex);
  free (buf);
  return EXIT_SUCCESS;
}

执行结果

20200208180634103.png

相关文章
|
7天前
|
存储 缓存
解析HTTP通用首部字段
【7月更文挑战第18天】HTTP通用首部字段是指,请求报文和响应报文双方都会使用的首部。
|
15天前
|
SQL 安全 数据安全/隐私保护
DVWA Open HTTP Redirect 通关解析
DVWA Open HTTP Redirect 通关解析
|
22天前
|
域名解析 Web App开发 缓存
在浏览器上输入一个网址后,发生了什么?/HTTP的工作流程/DNS域名解析过程
在浏览器上输入一个网址后,发生了什么?/HTTP的工作流程/DNS域名解析过程
|
29天前
|
PHP
php 获取带http或https的域名
php 获取带http或https的域名
23 4
|
1月前
|
域名解析 存储 缓存
HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口
【6月更文挑战第23天】 HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口;TCP连接(HTTP/1.1可能需排队);三次握手;发送请求头与体;服务器处理并返回响应;TCP连接可能关闭或保持;浏览器接收并显示响应,更新缓存。HTTP版本间有差异。
37 5
|
1月前
|
Java 应用服务中间件 API
Tomcat处理一个HTTP请求的执行流程的详细解析
Tomcat处理一个HTTP请求的执行流程的详细解析
43 4
|
20天前
|
数据安全/隐私保护
https【详解】与http的区别,对称加密,非对称加密,证书,解析流程图
https【详解】与http的区别,对称加密,非对称加密,证书,解析流程图
13 0
|
28天前
|
JavaScript Serverless Go
函数计算产品使用问题之如何获取HTTP函数的域名地址
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
1月前
|
Web App开发 数据采集 自然语言处理
DataWorks产品使用合集之表使用权限通常是根据什么绑定的
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
SQL Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
在运行一个group by的sql时,抛出以下错误信息: Task with the most failures(4):  -----Task ID:  task_201411191723_723592_m_000004URL:  http://DDS0204.
933 0

相关产品

  • 云解析DNS
  • 推荐镜像

    更多