网络随意笔记

TCP收到RST复位, 哪些情况下会发生

1:客户端向服务器发送未在监听的端口, 或者不存在的端口时, 服务器会发送RST
2:客户端和服务器已经建立连接, 服务器重启了, 或者在服务器端该Socket已经关闭了, 会返回RST, 也即该连接为半打开连接.
3:接收消息超时, 当setsocketopt中设置SO_RCVTIMEO时, 如果在设置了recv超时时间, 那么如果这个时间间隔内未回复则会发送RST给对端. 表示超时不想连接了.
4:提前关闭, 客户端发来了5000个字节数据, 服务端程序写死收到了4000字节数据就close了, 此时
5:向一个已经关闭的socket上发送数据时, 对端会发送RST
6:防火墙阻止过来连接时, 也会回复RST

客户端和服务器建立起了TCP连接, 此时因为服务器异常, 重启了服务器, 之后TCP交互

		第一种情况: 客户端发送报文给服务器, 服务器重启了, 此时客户端会重发报文,  重发的时候,  因为服务器重启过了,  socket在服务端以及关闭了,  此时服务器会发送RST, 客户端收到RST后, 会清空发送缓冲队列, 然后CLOSED
		第二种情况: 服务器发送报文给客户端后, 发送出发后, 服务器重启了, 客户端接收到报文后, 回复ACK, 因服务端的socket已关闭, 则会直接发送客户端RST.

虚拟继承使用场景

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200722100156457.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l1eWl4aW9uZw==,size_16,color_FFFFFF,t_70)

    虚继承是为了解决重复继承中多个间接父类的问题的,所以不能使用上面简单的扩充并为每个虚基类提供一个虚函数指针(这样会导致重复继承的基类会有多个虚函数表)形式。

虚继承的派生类的内存结构,和普通继承完全不同。虚继承的子类,有单独的虚函数表,另外也单独保存一份父类的虚函数表,两部分之间用一个四个字节的0x00000000来作为分界。派生类的内存中,首先是自己的虚函数表,然后是派生类的数据成员,然后是0x0,之后就是基类的虚函数表,之后是基类的数据成员。

如果派生类没有自己的虚函数,那么派生类就不会有虚函数表,但是派生类数据和基类数据之间,还是需要0x0来间隔。

因此,在虚继承中,派生类和基类的数据,是完全间隔的,先存放派生类自己的虚函数表和数据,中间以0x分界,最后保存基类的虚函数和数据。如果派生类重载了父类的虚函数,那么则将派生类内存中基类虚函数表的相应函数替换
在这里插入图片描述

	◇概念:
	C++使用虚拟继承(Virtual Inheritance),解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。
	◇解决问题:
	解决了二义性问题,也节省了内存,避免了数据不一致的问题。
	◇同义词: 
	虚基类(把一个动词当成一个名词而已)
	当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本)

C++对象模型

多重继承, 不包含虚拟继承
多重继承, 单继承, 单虚拟继承, 多重虚拟继承对象模型分析:
要点:
C++实际模型是,1 :对于一般继承是扩充已有存在的虚函数表; 2: 对于虚继承添加一个虚函数表指针
1: 多重或单继承时,扩充第一个继承的基类的虚函数表, 将所有基类虚函数表中已经重载的虚函数替换成派生类的虚函数地址.
2:多重继承时, 继承了多少个基类, 派生类的对象模型中就有多少个虚函数表指针, 派生类自身定义的虚函数则在第一个基类的虚函数表中扩充. 如图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值