IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> workflow(3) -> 正文阅读

[网络协议]workflow(3)

2021SC@SDUSC

DNSCache中的头文件

? ? ? ?接着上一篇博客,现在分析DNSCache.h文件中的内容,“LRUCache.h"已经分析过了,它还包含"platformSocket.h",代码比较简洁,定义了不同平台实现网络间通信需要的结构体、头文件。

#ifndef _PLATFORMSOCKET_H_
#define _PLATFORMSOCKET_H_

#include <sys/types.h>

#ifdef _WIN32
# include <Ws2tcpip.h>
# include <Ws2def.h>
/*
typedef struct _WSABUF {
	ULONG len;
	CHAR  *buf;
} WSABUF, *LPWSABUF;
*/
struct iovec
{
	void *iov_base;
	size_t iov_len;
};

#else
# include <arpa/inet.h>
# include <sys/socket.h>
# include <sys/un.h>
# include <sys/uio.h>
# include <netdb.h>

#endif

#endif

? ? ? ? ?#indef_WIN32 ... #else ...这样的写法是为了方便代码在不同的平台(Windows、Linux)之间移植,根据不同的平台设计不同的diamante。符合workflow的可移植性。TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字。#include<Ws2tcpip.h>以及Linux下对等的这些头文件是为了实现网络间通信。

? ? ? ?结构体iovec定义了一个向量元素,指针成员iov_base指向一个缓冲区,这个缓冲区存放的是要接受的数据或者要发送的数据,io v_len可以确定为可以接受的最大长度以及实际写入的长度。?

?class DNSCache

public:
	using HostPort = std::pair<std::string, unsigned short>;
	using DNSHandle = LRUHandle<HostPort, DNSCacheValue>;

? ? ? ?类中的两个公开成员hostPort、DNSHandle的定义。using在这里是为了类型重命名,std:pair主要的作用是将两个数据合成为一个数据,数据类型可以相同也可以不同,与结构体实质一样。初始化一个pair可以使用构造函数,也可以使用std:make_pair函数:

template pair make_pair(T1 a, T2 b) { return pair(a, b); }

? ? ? ?类中的私有成员,mutex控制访问cache的线程数量,它协调各个线程,保证合理地使用公共资源。void operator() (const DNSCacheValue& value) const 是对“()”进行重载操作,

? ? ? ? 由getaddrinfo返回的存储空间,包括addrinfo结构、ai_addr结构等,都是用malloc动态获取的。调用freeaddrinfo可将这些存储空间返回给系统,需要头文件#include <netdb.h>。

private:
	const DNSHandle *get_inner(const HostPort& host_port, int type);

	std::mutex mutex_;

	class ValueDeleter
	{
	public:
		void operator() (const DNSCacheValue& value) const
		{
			freeaddrinfo(value.addrinfo);
		}
	};

	LRUCache<HostPort, DNSCacheValue, ValueDeleter> cache_pool_;

? ? ? 接下来看类中实现了哪些函数,?总共有release、*get、*get_ttl、*get_confident、*put、del这几个方法,具体根据传入参数的不同又分别重载了几个同名的函数,观察函数体,实现的逻辑基一致。

    void release(DNSHandle *handle)
	{
		cache_pool_.release(handle);
	}
	void release(const DNSHandle *handle)
	{
		cache_pool_.release(handle);
	}


	const DNSHandle *get(const HostPort& host_port)
	{
		return cache_pool_.get(host_port);
	}

	const DNSHandle *get(const std::string& host, unsigned short port)
	{
		return get(HostPort(host, port));
	}

	const DNSHandle *get(const char *host, unsigned short port)
	{
		return get(std::string(host), port);
	}
 

	const DNSHandle *get_ttl(const HostPort& host_port)
	{
		return get_inner(host_port, GET_TYPE_TTL);
	}

	const DNSHandle *get_ttl(const std::string& host, unsigned short port)
	{
		return get_ttl(HostPort(host, port));
	}

	const DNSHandle *get_ttl(const char *host, unsigned short port)
	{
		return get_ttl(std::string(host), port);
	}


	const DNSHandle *get_confident(const HostPort& host_port)
	{
		return get_inner(host_port, GET_TYPE_CONFIDENT);
	}

	const DNSHandle *get_confident(const std::string& host, unsigned short port)
	{
		return get_confident(HostPort(host, port));
	}

	const DNSHandle *get_confident(const char *host, unsigned short port)
	{
		return get_confident(std::string(host), port);
	}


	const DNSHandle *put(const HostPort& host_port,
						 struct addrinfo *addrinfo,
						 unsigned int dns_ttl_default,
						 unsigned int dns_ttl_min);

	const DNSHandle *put(const std::string& host,
						 unsigned short port,
						 struct addrinfo *addrinfo,
						 unsigned int dns_ttl_default,
						 unsigned int dns_ttl_min)
	{
		return put(HostPort(host, port), addrinfo, dns_ttl_default, dns_ttl_min);
	}

	const DNSHandle *put(const char *host,
						 unsigned short port,
						 struct addrinfo *addrinfo,
						 unsigned int dns_ttl_default,
						 unsigned int dns_ttl_min)
	{
		return put(std::string(host), port, addrinfo, dns_ttl_default, dns_ttl_min);
	}

	
	void del(const HostPort& key)
	{
		cache_pool_.del(key);
	}

	void del(const std::string& host, unsigned short port)
	{
		del(HostPort(host, port));
	}

	void del(const char *host, unsigned short port)
	{
		del(std::string(host), port);
	}

? ? ? ?cache_pool是LRUCache类的对象,在上篇博客中分析过LRUCache这个类,主要是理解LRU的思想,这里就容易理解了。

参考资料:

(40条消息) C++编程时#ifdef _WIN32的作用_三又三分之一年的博客-CSDN博客

(40条消息) iovec结构体定义及使用_tym8865的专栏-CSDN博客

C++关键字之using的的用法总结 - 小念之歌 - 博客园 (cnblogs.com)

(40条消息) C++ std::pair的用法_qq_20853741的博客-CSDN博客_std::pair

(40条消息) 网络编程学习笔记(freeaddrinfo函数)_多看多听多总结-CSDN博客

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-09 19:59:31  更:2021-11-09 19:59:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/1 21:41:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码