秋招C++开发学习之路day22

day26(继承、为什么三次握手、TCP/UDP区别、socket基本操作)

  1. 简单介绍一下继承:
    继承就是利用已有的数据类型来定义新的数据类型,所定义的新的类型不仅拥有新定义的成员,同时还拥有旧的成员。
    一个基类派生的继承是单继承,从多个基类派生的继承称为多继承。
    三种继承方式,私有的继承,成员都变作私有的,保护继承都变成保护的,公有继承不变。但是三种方式的私有成员都不被派生类继承,即在派生类里不可见。
  2. 为什么三次握手,第三次握手是为了防止一个情况:就是客服端发出一个建立连接的请求后,因为某些原因滞留了较长时间,而第二个请求连接建立成功使用后释放完成,此时又收到第一个请求,服务端给出确认,但是客服端并没有发出建立连接的请求,就不会理睬这个服务端的确认报文段。假如没有第三次握手,服务端就会认为连接已经建立,就会一直等待客服端发来数据。
  3. TCP和UDP的区别
    连接上,tcp是面向连接的传输协议,传输数据前需要建立连接。udp则不需要。
    服务对象,tcp是点对点的服务。udp支持一对一,一对多,多对多。
    可靠性,tcp提供可靠交付,无差错,不丢失,按序到达。udp尽最大努力交付,不保证可靠性。
    拥塞控制,流量控制,tcp拥有拥塞控制和流量控制保证数据传输的安全性。udp没有拥塞控制,网络拥塞不会影响源主机的发送效率。
    报文长度,tcp是动态的报文长度,根据接收方窗口大小和当前网络拥塞情况决定的。udp面向报文,不合并,不拆分,保留上面传下来的报文的边界。
    首部开销,tcp首部开销大,首部20字节。udp首部开销小,8个字节。
  4. socket的基本操作
    socket(int domain,int type,int protocol);
    函数成功时返回一个小的非负整数值,称为套接口描述字(Socket Descriptor),简称套接字。三个参数:
    domain:协议域,又称协议族。协议族决定了套接口的地址类型,在通信中必须采用对应的地址。常用的协议族有:AF_INET,AF_INET6,AF_UNIX等。
    type:指定套接口类型,常用的:SOCK_STREAM,SOCK_DGRAM等。
    protocol:指定协议。常用的:IPPROTO_TCP,IPPTPTP_UDP等,分别代表tcp,udp。

bind()函数
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
bind函数把一个本地协议地址赋予套接口。三个参数:
sockfd:即套接字,它是通过socket()函数创建的,他唯一标识一个套接口。
addr:一个指向特定于协议的地址结构的指针。
addrlen:指出第二个参数中结构体的长度。
服务器启动时会绑定一个众所周知的地址(如IP地址+端口号),用于提供服务,客户也可以通过它来连接服务器;而客服端是系统自动分配的一个端口号和自身的IP地址组合。所以服务端在listen之前会调用bind。

listen()函数
int listen(int socket,int backlog);
listen函数仅有由TCP服务器调用,做两件事:
listen函数把一个未连接的套接口转换成一个被动套接口,指示内核可以接受指向该套接口的连接请求。
backlog:规定了内核应该为相应套接口排队的最大连接个数(包括已连接和未连接的队列)。

connect()函数
int connect(int sockfd,const struct sockaddr*addr,socklen_t addrlen);
TCP客户用connect函数来建立与TCP服务器的连接。
connect函数的第一个参数即为客户端的套接字,第二个参数为一个指向套接口地址结构的指针。第三个参数为第二个参数中结构体的长度。

accept()函数
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
第一个参数为服务器的套接字,第二个参数用于返回客户端协议地址,第三个参数为协议地址的长度。
如果accept成功,则返回值是由内核自动生成的一个全新的描述字,代表与所返回客户的TCP连接。

close()函数
int close(int fd);
close函数用来关闭套接口,并终止TCP连接。
close的操作只是使相应的套接字的引用计数减1,只有当引用计数为0的时候,才会触发TCP客户端向服务端发送终止连接请求。

描述一个面向连接的客户端socket程序主要步骤:
加载套接字库
创建套接字(socket())
向服务器发送连接请求(connect())
和服务器进行通信
关闭套接字(close())

shutdown()函数
int shutdown(int sockfd,int howto);
关闭一个socket有两种方法,一是close,二是shutdown。
参数:sockfd是需要关闭的套接口描述字,howto是允许为shutdown操作选择的以下几种方式。
SHUT_RD:关闭连接的读端,也就是该套接字不再接受数据。进程不能对其任何读操作。
SHUT_WR:关闭连接的写端,进程不能再对此套接字发出任何写操作。但可以读。
SHUT_RDWR:相当于调用两次shutdown,一次RD一次WR。

close是在引用计数为0时才关闭TCP连接,shutdown是不管引用计数,直接关闭。
close是同时终止读和写,TCP是全双工的,有时候需要半关闭,shutdown就可以完成。
​​在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值