从按下回车键开始

从按下回车键开始


DNS解析

DNS中文称为计算机域名系统
当我们在浏览器输入 http://www.qq.com 这个网址时,会首先将域名解析为ip地址
以下是DNS解析的步骤:

  1. 浏览器查看浏览器缓存,是否有域名对应的ip地址,有则解析成功。
  2. 查看本地(Hosts)缓存
  3. 查看路由器缓存:以上三步为客户端解析
  4. ISP(互联网服务提供商)DNS缓存查询
  5. 根域名服务器查询(全球共13台根服务器,1台主根服务器,12台辅根服务器),查询不到时会返回顶级域名主机ip地址,客户端使用此ip继续查询(.com)
  6. 顶级域名服务器查询,查询不到则返回域名主机ip地址(http://qq.com)
  7. 主域名服务器,重复查询知道找到 http://wwww.qq.com 这台主机
  8. 本地域名服务器将返回结果缓存,并给客户端
  9. 客户端拿着ip去与Web服务器建立链接

DNS是应用层协议
DNS解析为什么基于UDP协议

  1. udp无连接状态,不保证数据可靠性。TCP面向链接,可以保证数据可靠性
  2. UDP一次数据交换最短可以只有两个包,发起请求,响应数据。而TCP一次数据交换最少需要9个包,三次握手建立联系,请求数据,响应数据,四次挥手断开连接
  3. 考虑到TCP的开销太大,所以选用UDP,也因此导致全球只有13台根域名服务器

TCP的三次握手和四次挥手

  1. 三次握手
    client: 你好!在吗?
    server: 在呢!
    client: 那我开始发送数据了哦!

  2. 四次挥手
    client: 我要下线了,你还有啥要说的?
    server: 我没啥说的了
    server: 你还有啥要说的?
    client: 没了,拜拜!


计算机网络五层协议栈

  1. 应用层
    应用层直接与用户交互,主要协议有www, smtp, ftp, dns等。定义了应用进程间通信和交互的规则。虽然发送方知道自己发的什么,但接收方不知道,所以应用层协议规定了一个消息必须包含消息头和数据区。消息头定义了消息格式,长度等。以http协议为例,在chrome中,可以看到header中含有content-type,content-length等字段。如果没有应用层协议,那接受方拿到消息也不知道怎么办,怎么处理。
  2. 传输层
    传输层定义了端口到端口的通信规则。如果没有传输层协议,消息包到达一个主机时,却不知道是哪个进程的。此层的协议有TCP,IP协议。
  3. 网络层
    网络层主要解决了异构网络通信的问题。主机到主机的通信。我们都知道mac地址可以全球唯一标识一台机器,但只有以太网是基于mac地址的。所以我们引入ip地址来标识一台主机。使用ip地址通信时,传输ip数据包,ip数据包会包含在数据帧的数据区。
  4. 链路层
    链路层在物理上的表现两个相邻节点之间的数据交换。整个互联网的交互可以简化为很多交换机节点的交互。一个交换机意味着一个局域网。而局域网有多种实现。最常见的是以太网,除此之外还有令牌环绕,ATM,无线网络等。此层数据格式为数据帧,分为帧头,数据区,帧尾。以太网中的数据帧称为以太帧。
  5. 物理层
    物理层将数据帧转化为01比特流,来在光缆,双绞,无限波等介质中传播信号。只要涉及信号的调制解调。

ARP协议:IP地址与MAC地址的协作问题:
host_1广播:我是ip_1, mac_1, 我找 ip_2
host_2广播:我是ip_2,mac_2, 我找 ip_1
ARP告诉缓存:小本本记下来。

在Qt中,如果你想要监听键盘事件并当用户按下Enter键时触发某个函数,你可以通过`QEventLoop`和`QObject`的信号槽机制来实现。首先,你需要创建一个QObject派生的类,并连接一个槽函数到键盘按键事件上。以下是大致步骤: 1. 创建一个自定义的类,比如`MyWidget`,继承自`QWidget`: ```cpp class MyWidget : public QWidget { public: explicit MyWidget(QWidget *parent = nullptr); ~MyWidget(); private slots: void onEnterKeyPressed(); }; ``` 2. 在`MyWidget`的构造函数里,设置窗口接受键盘事件: ```cpp MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { setFocusPolicy(Qt::StrongFocus); // 设置窗口接收焦点 } void MyWidget::~MyWidget() {} // 槽函数处理Enter键按下 void MyWidget::onEnterKeyPressed() { // 这里编写你要执行的函数代码 qDebug() << "Enter key pressed"; } ``` 3. 接下来,在窗口显示时连接键盘事件到`onEnterKeyPressed`槽函数: ```cpp void MyWidget::showEvent(QShowEvent *event) { QShortcut *shortcut = new QShortcut(QKeySequence(Qt::Key_Return), this); shortcut->activated.connect(this, &MyWidget::onEnterKeyPressed); // 如果你想监听其他键,可以替换Qt::Key_Return为相应的键码 } ``` 4. 最后,在应用程序主循环中展示窗口并开始事件处理: ```cpp int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget window; window.show(); app.exec(); // 运行事件循环直到窗口关闭 return app.exec(); // 等待窗口关闭后再退出 } ``` 当你在`MyWidget`窗口内输入文本并按Enter键时,就会触发`onEnterKeyPressed`函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值