文章目录
一、UDP
特点
无连接不可靠
缺点
1、无连接,减少了开销和发送数据前的延迟
2、尽最大努力进行交付(不保证可靠交付),主机不需要维持复杂的连接状态表
3、面向报文:发送方的UDP对应用程序交下来的报文,在添加首部之后就向下交付给IP层,既不拆分也不合并,没有阻塞控制
4、支持一对一,多对一和多对多的交互通信
报文格式
长度
局域网:UDP传输数据的最长长度=1518-18-20-8=1472bit
广域网:UDP传输数据的最大长度=65535-IP(头20)-UDP(8)=65507bit 使用sendto函数发送超过65507会返回错误
二、C/S架构
优点
1、由于客户端实现与服务器的直接连接没有中间环节因此响应很快
2、操作界面漂亮,形式多样,可以充分满足客户自身的个性化要求
3、C/S结构的管理信息系统具有较强的事务处理能力,能实现复杂的业务流程
缺点
1、需要安装专门的客户端程序,分布功能弱针对面广且不具备网络条件的用户群体,不能够实现快速部署和安装
2、兼容性差对不同的开发工具,具有较大的局限性,采用不同的工具需要重新改写程序
3、开发成本高,需要具有一定的专业水平的技术人员才能完成
三、B/S
优点
1、具备分布式特点,可以随时随地地进行查询,浏览等业务
2、业务扩展简单,通过增加网页即可增加服务器功能
3、维护方便,只需要改变网页,即可实现所有用户同步更新
4、开发简单
缺点
1、表现要达到C/S程序的程度需要花费不少精力
2、在速度安全上需要花费巨大的设计成本,这是B/S架构的最大问题
二、TCP服务器实现过程
实现过程
1、创建套接字:socket函数
2、绑定IP地址以及端口号:bind()
3、将套接字文件描述符,从主动变为被动(做监听准备)listen()
4、等待客户端响应:被动监听客户端的连接并响应accept()
socket函数
头文件
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int socket(int domain, int type, int protocol);
int domain:ipV4:AF_INET IPV6: AF_INRT6(范围)
int type: 套接字类型
int protocol:参数一般为0
返回值
成功返回文件描述符,失败返回-1
功能
创建一个套接字文件,然后一文件形式来操作通信(没有文件名)
bind函数
头文件
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
int sockfd:socket函数创建的套接字
const struct sockaddr *addr:保存IP和端口号的结构体
socklen_t addrlen: 结构体长度
功能
指定通信协议的套接字文件与IP以及端口绑定起来
返回值
成功返回0,失败返回-1
结构体
struct socketaddr_in
{
sa_family sin_family;//设置IPV4 IPV5
_be16 sin_port; //设置端口号
struct in_addr sin_addr;//设置IP
};
unit32_t htonl(unit32_t hostlong);//字节序转化的函数
unit16_t htons(unit16_t hostshort);
h代表host n表示network s代表16位短整型
int inet_aton(const char *cp,struct in_addr *inp)
char *inet_ntoa(struct in_addrin)
函数里a代表ascii n代表network
listen函数
头文件
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int listen(int sockfd, int backlog);
int sockfd:
int backlog:指定队列容量()
(多个请求连接信号存储在这个参数里)
功能
将套接字文件描述符,从主动变为被动
返回值
成功返回0,失败返回-1
accept函数
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能
被动监听客户端发起的三次握手请求,成功,即建立连接
(监听客户端上线)
返回值
成功返回一个通信描述符,专门用于与该连接成功的客户端通信,总之后续服务器与客户端的正式通信,使用的是accept的通信描述符。
失败:-1