网络基本知识:
TCP协议分成了两个不同的协议
TCP:用来检测网络传输中差错的
TCP:面向连接的数据流传输服务 可靠 适合网络状况不是很好的场合
UDP:面向无连接的传输协议 不可靠,但是实时性更好,适合网络状况佳的场合
socket套接字:
socket是一种特殊的IO接口,也是一种文件描述符。不仅能实现本地不同进程之间的通信,而且通过网络能够在不同主机进程之间进行通信
分类:
流式套接字SOCK_STREAM 应用TCP通信
数据报套接字SOCK_DGRAM 应用UDP通信
IP:
IP地址用来标识网络中的一台主机,一个IP地址包含两部分:网络号和主机号,其中网络号和主机号根据子网掩码划分,有了源IP和目标IP,数据包就可以在不同主机之间传输
IP地址格式转换:
IP地址有十进制点分形式和32位二进制形式,前者是用户所熟悉的形式,后者是网络传输中IP地址的存储方式
inet_addr 将IPV4地址字符串转为32位二进制IP地址(网络字节序)
网络传输的基本知识:
(1)地址结构:
sockaddr和sockaddr_in
这两个结构体都是用来描述地址信息的,数据类型大小相同,通常用sockaddr_in用来保存某个网络地址,在使用时强转为sockaddr类型的指针
(2)端口
如果说IP地址可以表示网络中的一台主机,那么端口号可以用来代表主机内部的某个套接字,换句话说当一个套接字创建好后,需要把它和某个IP地址和端口号绑定起来,双方才能实现端到端的通信。
(3)字节序
网络中都是大端序
TCP编程
服务器端: 客户端
socket socket
bind ||
listen ||
accept <-------------------------------------------- connect
recv/recvfrom <------------------------------------- send/sendto
send/sendto ---------------------------------------> recv/recvfrom
close close
功能介绍:
socket用来创建一个套接字,同时指定协议和类型
bind 将函数保存在地址结构信息中的地址信息与套接字进行绑定,它用于服务器端,客户端创建的套接字可以不绑定地址
listen在套接字与地址进行绑定之后,通过调用listen函数将套接字设置成监听模式,准备接受客户端的链接请求
accept 等待并且接收客户端的链接请求,当TCP链接建立之后,该函数返回一个新的已连接套接字
connect 客户端通过该函数向服务器端的监听套接字发送链接请求
send/recv 这两个函数通常在TCP通信中用于发送和接收数据,也可以用在UDP中
sendto/recvfrom 一般用在UDP通信中,当用在TCP时,后面的几个与地址有关的参数不起作用,等同于send和recv
注意:在运行时需要先启动服务器,再启动客户端,无论是服务器还是客户端程序在运行都需要带上两个参数,代表是服务器端监听套接字绑定的IP地址和端口
UDP编程
使用UDP协议通信时服务器端和客户端无需建立链接,只需要知道对方套接字的地址信息就可以发送数据,服务器端只需要创建一个套接字接收不同客户端发来的请求,经过处理后再把结果发送给对应的客户端
注:在UDP编程中不需要bind
在UDP示例中,虽然服务器和客户端都调用recvfrom函数接收数据,但是最后两个参数不一样,对服务器来说,收到的数据可能来自任何一个客户端,因此服务器端需要保存客户端的地址信息,才能把数据发送回去,而对于客户端来书,只会有服务器的数据发送过来,因此不需要保存服务器的地址
服务器模型
在网络通信过程中,服务器端需要处理多个客户端,由于多个客户端的请求可能同时到来,服务器端可采用不同的方法来处理,一般处理方法分为:循环服务器模型和并发服务器模型
TCP循环服务器工作流程:
(1)服务器端从连接请求队列中提取请求,建立链接并返回新的已连接套接字
(2)服务器通过已连接套接字循环处理数据,处理并发送给客户端,直到客户端关闭链接
(3)服务器端关闭已连接套接字,返回步骤1
特点:服务器采用循环嵌套实现,外层循环依次提取每个客户端的链接请求,建立TCP链接,内层循环处理客户端数据,直到客户端关闭;如果当前客户端没有结束处理,其他客户端必须一直等待;采用这种模型的服务器端服务同时为多个客户端服务
TCP并发服务器工作流程
TCP并发服务器可以采用多进程也可以采用多线程来实现
(1)服务器端父进程从连接队列中提取请求,建立连接并返回新的已连接套接字
(2)服务器端父进程创建子进程为客户端服务,客户端关闭链接时,子进程结束
(3)服务器端父进程关闭已连接套接字,返回步骤1
特点:服务器daunt父进程一接收到客户端的链接请求,建立好链接并创建新的子进程,每个客户端在服务器端有一个专门的子进程为其服务;服务器端的父进程不具体处理每个客户端的数据请求
注意:采用这种模型的服务器需要避免僵尸进程
select并发服务器
epoll并发服务器