2_C/S模型编程示例1

2023-11-17

本文主要参考C语言中文网和linux网络编程-网络基础-socket编程-高并发服务器

1、网络程序设计模式

1.1 CS模式

客户机(client)/服务器(server)模式。需要在通讯两端各自部署客户机和服务器来完成数据通信
1)本地可进行大量数据的缓存处理,提高传输速率
2)所采用的协议相对灵活(可以自己定义)

1.2 B/S模式

浏览器/服务器模式。只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可
1)易开发,不受平台限制
2)缓存数据不尽如人意,协议选择不灵活

2、C/S模型编程实例

2.1 TCP协议的客户端/服务器程序的一般流程

在这里插入图片描述首先,服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回
数据传输的过程:
建立连接后,TCP协议提供全双工的通信服务,但是一般的客户端/服务器程序的流程是由客户端主动发起请求,服务器被动处理请求,一问一答的方式。因此,服务器从accept()返回后立刻调用read(),读socket就像读管道一样,如果没有数据到达就阻塞等待,这时客户端调用write()发送请求给服务器,服务器收到后从read()返回,对客户端的请求进行处理,在此期间客户端调用read()阻塞等待服务器的应答,服务器调用write()将处理结果发回给客户端,再次调用read()阻塞等待下一条请求,客户端收到后从read()返回,发送下一条请求,如此循环下去。
如果客户端没有更多的请求了,就调用close()关闭连接,就像写端关闭的管道一样,服务器的read()返回0,这样服务器就知道客户端关闭了连接,也调用close()关闭连接。注意,任何一方调用close()后,连接的两个传输方向都关闭,不能再发送数据了。如果一方调用shutdown()则连接处于半关闭状态,仍可接收对方发来的数据。
在学习socket API时要注意应用程序和TCP协议层是如何交互的: 应用程序调用某个socket函数时TCP协议层完成什么动作,比如调用connect()会发出SYN段 应用程序如何知道TCP协议层的状态变化,比如从某个阻塞的socket函数返回就表明TCP协议收到了某些段,再比如read()返回0就表明收到了FIN段

2.2 Server端程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet /in.h>
#include<arpa/inet.h>

#define MAXLINE 80
#define SERV_PORT 5000
int main(void)
{
struct sockaddr_in servaddr, cliaddr;
socklen_t cliaddr_len;
int listenfd , connfd;
char buf[MAXLINE];
char str [INET_ADDRSTRLEN];
int i ,n;
listenfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr)); //把指定内存的全部字节置零,可以用memset代替
servaddr.sin_family = AF_INET;

/*INADDR_ANY 转换过来就是0.0.0.0,泛指本机的意思,也就是表示本机的所有IP*/
/* htonl(INADDR_ANY);seradr的ip地址是本机的所有ip并转换成了网络字节序*/
seraddr.sin_addr.s_addr = htonl(INADDR_ANY); 

/*把listenfd 与servaddr绑定在一起,ip地址为所有ip地址,端口号为SERV_PORT */
bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)); 
/*监听listenfd backlog最多为20*/
listen(listenfd,20);

printf("Accepting connections ...\n");
while(1){
	cliaddr_len = sizeof(cliaddr);
	/**/
	connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len);
	n = read(connfd,buf,MAXLINE);
	printf("received from %s at PORT %d\n",\
	inet_ntop(AF_INET,&cliaddr.sin_addr,str,sizeof(str)),\ // inet_ntop函数原型如下[将“二进制整数” -> “点分十进制”]
	ntohs(cliaddr.sin_port)); //将一个16位数由网络字节顺序转换为主机字节顺序 
	for(i = 0;i<n;i++)
	{buf[i] = toupper(buf[i]);}  //toupper函数把小写字母转换为大写字母
	write(connfd,buf,n);
	close(connfd);
}
return 0;
}

2.2 Client端程序

client.c的作用是从命令行参数中获得一个字符串发给服务器,然后接收服务器返回的字符串并打印
**由于客户端不需要固定的端口号,因此不必调用bind(),客户端的端口号由内核自动分配。注意,客户端不是不允许调用bind(),只是没有必要调用bind()固定一个端口号,服务器也不是必须调用bind(),但如果服务器不调用bind(),内核会自动给服务器分配监听端口,每次启动服务器时端口号都不一样,客户端要连接服务器就会遇到麻烦。**嵌入式通信,一般两方都绑定固定的端口号

#include <stdio.h>
#inclue <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/scoket.h>
#include <netinet/in.h>

#define MAXLINE 80
#define SERV_PORT 5000;
int main(int argc,char *argv[])
{
struct sockaddr_in servaddr;
char buf[MAXLINE];
int sockfd,n;
char *str;
if(argc !=2){
fputs("usage:./client message\n,stderr");
exit(1);
}
str = argv[1];
sockfd = socket(AF_INET,SOCK_STREAM,0);

bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
/*inet_pton 将点分十进制转换为二进制*/
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT) //Host to Network Shor

connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));

write(sockfd,str,strlen(str));
n = read(sockfd,buf,MAXLINE);
printf("Response from server:\n");
write(STDOUT_FILENO, buf, n); // STDIN_FILENO 是标准输出的文件描述符

close(sockfd);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2_C/S模型编程示例1 的相关文章

  • 如何使用内网穿透实现iStoreOS软路由公网远程访问局域网电脑桌面

    文章目录 简介 一 配置远程桌面公网地址 二 家中使用永久固定地址 访问公司电脑 具体操作方法是 简介 软路由 是PC的硬件加上路由系统来实现路由器
  • CCF模拟题 202309-2 坐标变换(其二)

    问题描述 试题编号 202309 2 试题名称 坐标变换 其二 时间限制 1 0s 内存限制 512 0MB 问题描述 对于平面直角坐标系上的坐标 x y 小 P 定义了如下两种操作 1 拉伸 k 倍 横坐标 x 变为 kx 纵坐标 y 变
  • “性能压测揭密:关键指标分析!“

    在进行全链路压测和性能测试时 需要关注多个关键性能指标 KPIs 来评估系统的性能表现 以下是一些常见的性能测试指标 1 吞吐量 Throughput 系统在单位时间内能够处理的请求数量或事务数量 通常以每秒请求数 RPS TPS 来衡量
  • 虚拟主机操作系统 Windows、Linux

    操作系统将直接影响服务器的性能 安全性和可用性 因此确保选择合适的操作系统对于成功运行您的网站或应用程序至关重要 以下是一些考虑因素 可帮助您选择适合您需求的虚拟主机操作系统 1 熟悉度和技术支持 如何选择操作系统应该考虑您的经验水平和熟悉
  • Linux中如何查看开启了哪些端口?

    在Linux中 端口是设备与外界通讯交流的出口 常用于指TCP IP协议中的端口 其按照端口号可以分为三类 分别是 公认端口 注册端口 动态端口 那么Linux中如何查看开启了哪些端口 以下是常用命令介绍 1 使用netstat命令 net
  • CMAKE_MAKE_PROGRAM is not set 解读

    目录 CMAKE MAKE PROGRAM 未设置 错误原因 解决方案 示例1 GNU Make 示例2 Ninja CMakeLists txt 的结构 示例 CMakeLists txt 文件 总结 CMAKE MAKE PROGRAM
  • CTF之逆向入门

    逆向工程 Reverse Engineering 又称反向工程 是一种技术过程 即对一项目标产品进行逆向分析及研究 从而演绎并得出该产品的处理流程 组织结构 功能性能规格等设计要素 以制作出功能相近 但又不完全一样的产品 逆向工程源于商业及
  • 华为OD机试真题-围棋的气-2023年OD统一考试(C卷)

    题目描述 围棋棋盘由纵横各19条线垂直相交组成 棋盘上一共19x19 361个交点 对弈双方一方执白棋 一方执黑棋 落子时只能将棋子置于交点上 气 是围棋中很重要的一个概念 某个棋子有几口气 是指其上下左右方向四个相邻的交叉点中 有几个交叉
  • 基于成本和服务质量考虑的不确定性下,电动汽车充电网络基础设施需求预测和迭代优化的分层框架研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • 如何解决Mybatis-plus与Mybatis不兼容的问题:An attempt was made to call a method that does not exist. The attempt

    博主猫头虎的技术世界 欢迎来到 猫头虎的博客 探索技术的无限可能 专栏链接 精选专栏 面试题大全 面试准备的宝典 IDEA开发秘籍 提升你的IDEA技能 100天精通Golang Go语言学习之旅 领域矩阵 猫头虎技术领域矩阵 深入探索各技
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理

    文章目录 1 什么是DES 2 DES的基本概念 3 DES的加密流程 4 DES算法步骤详解 4 1 初始置换 Initial Permutation IP置换 4 2 加密轮次 4 3 F轮函数 4 3 1 拓展R到48位 4 3 2
  • 【信道估计】【MIMO】【FBMC】未来移动通信的滤波器组多载波调制方案(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 如何使用Imagewheel搭建一个简单的的私人图床无公网ip也能访问

    文章目录 1 前言 2 Imagewheel网站搭建 2 1 Imagewheel下载和安装 2 2 Imagewheel网页测试 2 3 cpolar的安装和注册 3 本地网页发布 3 1 Cpolar临时数据隧道
  • HPE Aruba Networking:五大网络现代化策略助力实现校园数字化转型

    作者 Aruba中国区技术销售总监 俞世丹 全球数字化进程日益加深 科技已成为加速教育行业发展的重要驱动力 人工智能 大数据 云计算 物联网 虚拟现实等新兴技术的快速发展 正在深刻改变着教育的形态和模式 为了更好地满足学校师生个性化教育教学
  • 基于java的物业管理系统设计与实现

    基于java的物业管理系统设计与实现 I 引言 A 研究背景和动机 物业管理系统是指对物业进行管理和服务的系统 该系统需要具备对物业信息 人员信息 财务信息等进行管理的能力 基于Java的物业管理系统设计与实现的研究背景和动机主要体现在以下
  • 网络安全(黑客)自学启蒙

    一 什么是网络安全 网络安全是一种综合性的概念 涵盖了保护计算机系统 网络基础设施和数据免受未经授权的访问 攻击 损害或盗窃的一系列措施和技术 经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 作
  • 网络安全(黑客)自学启蒙

    一 什么是网络安全 网络安全是一种综合性的概念 涵盖了保护计算机系统 网络基础设施和数据免受未经授权的访问 攻击 损害或盗窃的一系列措施和技术 经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 作
  • 【无标题】

    大家都知道该赛项的规程和样题向来都是模棱两可 从来不说具体的内容 导致选手在备赛时没有头绪 不知道该怎么训练 到了赛时发现题目和备赛的时候完全不一样 那么本文将以往年信息安全管理与评估赛项经验来解读今年2023年国赛的规程 帮助选手们指明方
  • 网工内推 | 上市公司同程、科达,五险一金,年终奖,最高12k*15薪

    01 同程旅行 招聘岗位 网络工程师 职责描述 1 负责职场 门店网络规划 建设 维护 2 负责网络安全及访问控制 上网行为管理和VPN设备的日常运维 3 负责内部相关网络自动化和系统化建设 4 优化与提升网络运行质量 制定应急预案 人员培

随机推荐

  • 模型选择、欠拟合和过拟合

    训练误差 training error 模型在训练数据集上表现出的误差 泛化误差 generalization error 模型在任意一个测试数据样本上表现出的误差的期望 常常通过测试数据集上的误差来近似 机器学习模型应该关注泛化误差 模型
  • 简单的开集电极保护电路

    开集电极方式输出经常用于需要向外强力驱动输出数字或者脉冲缓冲信号的情况 在严酷的工作环境下比如汽车系统 这些信号需要被保护用来抵抗那些加在输入信号上可以立即损坏三极管的不可预知的短路信号 通常在开集电极的输出端嵌入一系列电阻的方法也有它的缺
  • 关于"Ueditor 请求后台配置项http错误,上传功能将不能正常使用"的解决办法

    这两天用到Ueditor1 4 3 3的NET版本时 也遇上了这个问题 在网上查了一下 大多都是JS或者JAVA用户遇到的解决办法 另外少部份NET用户遇到 但按他们的方法试过后都不行 再说了按错误提示与自己网站的实际目录对比了一下 设置是
  • 爬虫学得好,然后呢?最新Python人工智能就业班课程

    课程链接 私信 达内 课程介绍 达内最新Python 人工智能就业班课程目录 1 Python核心 2 面向对象程序设计 3 Python高级 4 阶段项目实战 5 Linux操作系统 6 数据处理 7 网络并发编程 8 阶段项目实战 9
  • C++ 最长回文串

    已知一个只包括大小写字符的字符串 求用该字符串中的字符可以生成的最长回文字符串的长度 例如 s abccccddaa 可生成的最长回文字符串长度为9 如dccaaaccd adccbccda acdcacdca等 都是正确的 利用字符哈希方
  • 合肥工业大学密码学课设-RSA

    作者简介 CSDN内容合伙人 信息安全专业在校大学生 系列专栏 课设 密码学课设 RSA 新人博主 欢迎点赞收藏关注 会回访 舞台再大 你不上台 永远是个观众 平台再好 你不参与 永远是局外人 能力再大 你不行动 只能看别人成功 没有人会关
  • windows操作系统基础总结

    文章目录 引言 一 文件目录管理 二 网络配置 三 用户和群组 四 进程 五 核心文件 六 日志审核 七 登录日志 八 恶意行为跟踪 九 日志分析工具 引言 对windows下常见的dos命令进行总结 以及windows操作系统基础知识进行
  • Linux Centos7 测试硬盘IO速度

    1 测试磁盘写速度 time dd if dev zero of test dd bs 1M count 2000 2 测试磁盘读速度 time dd if test dd of dev null bs 1M
  • 云计算:优势与未来趋势

    文章目录 前言 一 云计算的优势 1 降低IT成本 2 提高工作效率 3 提高业务的可靠性和稳定性 4 提升安全性 二 未来发展趋势 1 AI与云计算的融合 2 边缘计算的发展 3 多云的趋势 4 服务器和存储的创新 三 行业应用案例 1
  • spring ioc流程

    spring 大体流程 spring的核心是ioc 所有的操作都是基于ioc来完成的 ioc是一个容器 为了解决类跟类之间的耦合问题 就是说 有一个A类 有一个B类 public class A B b new B public class
  • 理解图像卷积操作的意义

    数字信号处理中卷积 卷积一词最开始出现在信号与线性系统中 信号与线性系统中讨论的就是信号经过一个线性系统以后发生的变化 由于现实情况中常常是一个信号前一时刻的输出影响着这一时刻的输出 所在一般利用系统的单位响应与系统的输入求卷积 以求得系统
  • STM32MP153 Ubuntu系统移植到ST的STM32MP157-DK2记录

    米尔科技STM32MP153 Ubuntu系统移植到ST的STM32MP157 DK2记录 ubuntu18 ros系统 边缘计算 先上最终效果 核心思想 1 解包 挂载 先把米尔科技提供的ubuntu文件系统解包 然后挂载到一个文件夹mn
  • mybatis与mysql的Json格式映射-使用JSONObject

    mybatis与mysql的Json格式映射 使用JSONObject codestn 程序方块 mybatis与mysql的Json格式映射 使用JSONObject JavaBean类 1 2 3 4 5 6 7 public clas
  • 江西南昌电气机械三维测量仪机械零件3d扫描-CASAIM中科广电

    精密机械零部件是指机械设备中起到特定功能的零件 其制造精度要求非常高 这些零部件通常由金属 塑料或陶瓷等材料制成 常见的精密机械零部件包括齿轮 轴承 螺丝 活塞 阀门等 精密机械零部件的制造需要高精度的加工设备和工艺 以确保其尺寸 形状和表
  • wps指定路径不存在怎么办_WPS说目录不存在

    网友提问 安装wps之后 将其打开报错文件 打开的时候提示wps目录不存在的现象 并且将其卸载也是于事无补 那wps临时目录不存在提示无法卸载是怎么回事 下面就来看看wps临时目录不存在提示该如何解决 故障解决 一 wps应用程序本身的故障
  • Python pathlib库路径,使用sorted(中文、字母和数字混合名称)定义排序,解决1位数、2位数、3位数的数字排序问题

    Path rgolb 当路径指向一个目录时 列出该路径下所有子路径 默认升序排列 输出为 使用sorted和lambda定义排序 中文 字母和数字混合名称的排序 输出
  • SpringCloud简介及使用

    SpringCloud简介 Spring cloud是一个基于Spring Boot实现的服务治理工具包 在微服务架构中用于管理和协调服务的 微服务 就是把一个单体项目 拆分为多个微服务 每个微服务可以独立技术选型 独立开发 独立部署 独立
  • Ego小程序测试

    Ego小程序测试 一 前置知识 1 小程序MiniProgram 2 小程序和App区别 3 小程序和App联系 4 微信开发者工具 5 技术架构 二 Ego商城介绍 三 测试流程 四 Ego商城项目部署 1 注册微信小程序账号 2 后端部
  • 数据分析之面试题目汇总(万字解读)

    1 解释数据清洗的过程及常见的清洗方法 数据清洗是指在数据分析过程中对数据进行检查 处理和纠正的过程 是数据预处理的一步 用于处理数据集中的无效 错误 缺失或冗余数据 常见的清洗方法包括 处理缺失值 处理异常值 去除重复值 统一数据格式等
  • 2_C/S模型编程示例1

    本文主要参考C语言中文网和linux网络编程 网络基础 socket编程 高并发服务器 1 网络程序设计模式 1 1 CS模式 客户机 client 服务器 server 模式 需要在通讯两端各自部署客户机和服务器来完成数据通信 1 本地可