嵌入式笔记22 UDP C/S、B/S架构 TCP服务器实现过程

本文介绍了嵌入式系统中UDP的特点、报文格式和长度,以及C/S和B/S架构的优缺点。在TCP服务器实现过程中,详细阐述了socket、bind、listen和accept函数的使用,包括其头文件、功能和返回值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_49181551

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值