目录
一、TCP/UDP的区别、应用场景
二、UDP里client、server使用的过程
三、TCP端口复用问题
四、TCP三次握手
五、TCP四次挥手
六、Qt信号槽的连接方式
七、一个信号连接多个槽时,槽函数的调用顺序
八、信号槽是不是都可以重载
九、信号槽的实现机制
十、Qt的事件循环
一、TCP/UDP的区别、应用场景
- TCP面向连接而UDP无连接,TCP是一对一的,UDP可做到多对多、单播、组播、多播;
- TCP的头部字节长,UDP头部字节短,TCP多了序列号、确认号等等;
- TCP有数据确认和重传机制、可靠传输,UDP不可靠,更容易出现乱序、丢包现象;
- TCP有网络拥塞控制而UDP没有,UDP在网络不好时仍正常发出,可能丢包;
- TCP是字节流,因此易粘包,UDP是报文的形式,不粘包;
- TCP适用于对可靠传输要求高的场合,如FTP文件传输;UDP适用于对实时性要求高的场合,如即时通讯、视频会议等。
二、UDP里client、server使用的过程
client和server是一样的,UDP里没有这俩概念的区分吧~
发:创建套接字指定IPv4和UDP->指定接收方IP和port->报文组帧->调用sendto()发出,UDP发送可以不指定本机端口号,随机选定;
收:创建套接字指定IPv4和UDP->指定本机接收的port->开辟缓存区用以接收数据->调用recvfrom()收->解析IP和port做数据分流->数据处理。
三、TCP端口复用问题
涉及到两个相关问题:
TCP服务端监听端口A,断开后再重新监听该端口A,提示忙,应该怎么做;
网络通信多个进程监听同一个端口是否可以。
答案是端口复用,创建套接字时使用端口复用选项SO_REUSEADDR。
断开后socket处于TIME_WAIT状态,此时重新bind会出错返回,绑定端口不成功。
2MSL最大报文段生存时间,1是客户端应答的时间,1是客户端收网络上剩余报文的时间。
四、TCP三次握手
- 客户端发起连接请求,报文中携带客户端报文序列号、同步号;
- 服务器收到连接请求,回复服务器报文序列号、同步号、建立连接应答、客户端报文应答,表示可连接;
- 客户端再次应答,回复客户端报文序列号+1、服务器报文应答、建立连接应答,连接建立。
五、TCP四次挥手
- 客户端发出结束连接请求,客户端报文序列号、同步号;
- 服务器响应断开请求,应答客户端报文、同步号、断开连接的应答、服务端报文序列号;
- 服务器完成剩余报文的发送,然后再向客户端发出结束连接确认帧,服务器端报文序列号+1、同步号、应答客户端报文、断开连接的应答,服务器端关闭;
- 客户端收到服务器的结束连接确认帧,进入TIME_WAIT状态,并发送结束连接应答、服务器端报文应答、同步号、客户端报文序列号;
- TIME_WAIT时间到后,客户端正式结束连接,关闭。
六、Qt信号槽的连接方式
connect分五种:默认、直连、队列阻塞、队列不阻塞、unique。
- 同线程默认直接连接,跨线程默认队列阻塞;
- 直接连接用在同线程内,类似常规函数调用;
- 队列阻塞用在跨线程,信号发出方发出信号后阻塞线程,等待槽函数线程处理完返回后再继续,千万不能用在同线程内,否则自己等自己导致线程卡死;
- 队列不阻塞用在跨线程,信号发出方发出信号后不阻塞,继续往下执行,由槽函数线程自行处理,信号槽一般是void返回值的;
- unique连接,相同信号相同槽只连接一次,若之前已有连接则此次unique连接不生效。
- Qt5和Qt4的connect()语法不一样,不过Qt5向下兼容了。
七、一个信号连接多个槽时,槽函数的调用顺序
按照connect的顺序。
信号槽是多对多的,即一个信号可以连接多个槽,多个信号可以连接至同一个槽,信号可以连接到另一个信号。
八、信号槽是不是都可以重载
可以。
信号的参数列表个数可以大于槽的,多余的将被忽略。
九、信号槽的实现机制
想要使用信号槽的类需直接或间接继承QObject,且在类的开头位置声明Q_OBJECT宏,MOC机制(meta object compile元对象编译)发挥了核心作用。
信号槽底层用观察者的方式实现,可以理解为信号即发布者的notify()方法,槽即在notify()方法中被调用的订阅者的update()方法。
MOC元对象编译的引入是必要的,因为信号槽等并不是标准的C++语法,需要MOC做一次转换以正常编译,自成体系的编译器应该都有类似机制。
十、Qt的事件循环
用过但不知其所以然,在网上看过也还没理解透,先TODO后续再补上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)