C/S模型测试

1

1.1代码示例

#include<stdio.h>
#include<stdio.h>#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>#include <sys/stat.h>
#include <fcntl.h>#include <unistd.h>#include <string.h>int main(void)
{int sockfd=0;int ret=0;struct sockaddr_in seraddr;char tmpbuff[4096]={"I need some offers"};int cnt=0;ssize_t nsize=0;/* 1 创建网络套接字 */sockfd=socket(AF_INET,SOCK_STREAM,0);if(-1==sockfd){perror("fail to socket");return -1;}/* 2 初始化网络地址结构体 */seraddr.sin_family=AF_INET;seraddr.sin_port=htons(50000);seraddr.sin_addr.s_addr=inet_addr("192.168.1.123");/* 3 发送连接请求 */ret=connect(sockfd,(struct sockaddr *)&seraddr,sizeof(seraddr));if(-1==ret){perror("fail to connect");return -1;}/* 4 客户端与服务器交互 */while(1){
#if 0/* 4.1 清空发送缓冲区 */memset(tmpbuff,0,sizeof(tmpbuff));/* 4.2 拼接数据 */sprintf(tmpbuff,"client send:### %d",cnt);cnt++;/* 4.3 发送数据到网络套接字 */nsize=send(sockfd,tmpbuff,strlen(tmpbuff),0);if(-1==nsize){perror("fail to send");return -1;}
#endif#if 1/* 清空接收缓冲区 */memset(tmpbuff,0,sizeof(tmpbuff));/* 接收网络套接字数据 */nsize=recv(sockfd,tmpbuff,sizeof(tmpbuff),0);if(-1==nsize){perror("fail to recv");return -1;}
#endif/* 显示接收数据 */printf("client recv:### %s\n",tmpbuff);}/* 5 关闭网络套接字 */close(sockfd);return 0;
}int main(void)
{int sockfd=0;struct sockaddr_in seraddr;int ret=0; int confd=0;char tmpbuff[4096]={0};ssize_t nsize=0;/* 1 创建网络套接字 */sockfd=socket(AF_INET,SOCK_STREAM,0);if(-1==sockfd){perror("fail to socket");return -1;}/* 2 初始化网络地址结构体 */seraddr.sin_family=AF_INET;seraddr.sin_port=htons(50000);seraddr.sin_addr.s_addr=inet_addr("192.168.1.123");/* 3 绑定网络套接字 */ret=bind(sockfd,(struct sockaddr *)&seraddr,sizeof(seraddr));if(-1==ret){perror("fail to bind");return -1;}/* 4 监听网络套接字 */ret=listen(sockfd,10);if(-1==ret){perror("fail to listen");return -1;}/* 5 服务器与客户端交互 */while(1){/* 5.1 创建通信套接字-阻塞等待网络套接字连接请求*/confd=accept(sockfd,NULL,NULL);if(-1==confd){perror("fail to accept");return -1;}#if 0/* 5.2 清空接收缓冲区 */memset(tmpbuff,0,sizeof(tmpbuff));/* 5.3 接收通信套接字数据-并做接收完成处理 */nsize=recv(confd,tmpbuff,sizeof(tmpbuff),0);if(-1==nsize){perror("fail to recv");return -1;}else if(0==nsize){return 0;}
#endif/* 5.2 清空发送缓冲区 */memset(tmpbuff,0,sizeof(tmpbuff));/* 5.4 拼接 */sprintf(tmpbuff,"server send:### %s",tmpbuff);/* 5.5 发送 */nsize=send(confd,tmpbuff,strlen(tmpbuff),0);if(-1==nsize){perror("fail to send");return -1;}}/* 6 关闭通信套接字 */close(confd);/* 7 关闭网络套接字 */close(sockfd);return 0;
}

1.2运行结果

(1)运行服务器
(2)运行客户端现象如下:客户端发生阻塞

在这里插入图片描述

(1)关闭服务器:客户端不阻塞-说明recv函数为非阻塞状态

在这里插入图片描述

总结:
(1)如果将服务器accept函数放在while循环内部:同时运行客户端与服务器,可以发现服务器可以与多个客户端建立连接(解决的问题-服务器并发访问)。
(2)但是只能进行一次数据发送(虽然解决了服务器的并发访问问题,但是对于大量的数据传输却手足无措)小意外:当服务器端退出,此时客户端不再阻塞,正常执行函数体。(这就说明了,此时recv函数为非阻塞状态=》那么服务器和客户端同时运行,为什么会发生阻塞?)补充:
(1)如果将服务器端accept函数放在while循环外部(对比TCP文件传输):1)只有一个客户端能够与服务器建立连接并进行数据收发;其它客户端被阻塞,无法与服务器建立连接。(问题:(1)服务器只能与一个客户端建立连接?(2)那么如何解决这个问题?(3)是从服务端解决这个问题,还是从客户端解决这个问题?	先解决问题(3):显然,要解决这个问题肯定是要从服务器端去解决--客户端是向服务器端发起连接请求,那么具体是否能够建立连接,显然是取决于服务器端的意愿和能力;所以,多个客户端向服务器端发起连接请求,能不能实现的关键在于服务器能不能接受多个客户端接入,服务器端是否允许多个客户端接入。	下面再解决问题(2):解决这个问题,其实用一句话来表述就是解决服务器并发访问问题,这个问题后面专项解决,现在只需要明白所面临的问题是服务器并发访问的问题即可。)(2)如果将connect函数放在循环外部,将accept函数放在循环外部,此时意味着:客户端与服务器端第一次建立连接,可以发送一次数据;发完数据接着进行第二次,第三次。。。连接请求;此时当然是报错!因为同一个网络套接字只能建立一次连接,不能重复建立连接(这是由TCP通信机制决定的);但是这种方式可以将服务器同时与多个客户端建立连接。。。。。。。。。。。。。。总结一下就是:客户端与服务器端要进行多次请求连接-建立连接;那么每进行一次通信,都必须关闭(close)通信套接字(已经建立三次握手,四次挥手连接的套接字confd-accept)。

在这里插入图片描述

问题:(1)在客户端或者服务器的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/19924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu 20.04安装桌面并远程连接

参考&#xff1a; https://www.zmy6.com/archives/234 https://blog.csdn.net/weixin_42068573/article/details/131227544 https://blog.csdn.net/LoongEmbedded/article/details/132434219 sudo apt install ubuntu-desktopsudo apt install xrdpsudo systemctl status xrdpp…

推荐系统三十六式学习笔记:02|个性化推荐系统有哪些绕不开的经典问题?

目录 推荐系统的问题模式评分预测行为预测 几个常见顽疾1、冷启动问题2、探索与利用问题安全问题 总结 推荐系统的问题模式 推荐系统的使命是为用户和物品建立连接&#xff0c;建立的方式是提前找出哪些隐藏的连接呈现给用户&#xff0c;这是一个预测问题&#xff1b;所以推荐…

IMU状态预积分代码实现 —— IMU状态预积分类

IMU状态预积分代码实现 —— IMU状态预积分类 实现IMU状态预积分类 实现IMU状态预积分类 首先&#xff0c;实现预积分自身的结构。一个预积分类应该存储一下数据&#xff1a; 预积分的观测量 △ R ~ i j , △ v ~ i j , △ p ~ i j \bigtriangleup \tilde{R} _{ij},\bigtrian…

2024年5月个人工作生活总结

本文为 2024年5月工作生活总结。 研发编码 golang 多个defer函数执行顺序 golang 函数中如有多个defer&#xff0c;倒序执行。示例代码&#xff1a; func foo() {defer func() {fmt.Println("111")}()defer func() {fmt.Println("2222")}()defer func()…

2020 6.s081——Lab2:system calls

左岸的一座白色环形阶梯 浪人正在用和弦练习忧郁 晨曦下的少女听着吉他旋律 在许愿池边巴洛克式的叹息 ——许愿池的希腊少女 完整代码见&#xff1a;SnowLegend-star/6.s081 at syscall (github.com) System call tracing (moderate) 这个实验要求我们跟踪系统调用。 感觉实…

平衡二叉树的应用举例

AVL 是一种自平衡二叉搜索树&#xff0c;其中任何节点的左右子树的高度之差不能超过 1。 AVL树的特点&#xff1a; 1、它遵循二叉搜索树的一般属性。 2、树的每个子树都是平衡的&#xff0c;即左右子树的高度之差最多为1。 3、当插入新节点时&#xff0c;树会自我平衡。因此…

前端项目负责人(虚拟岗)

定位&#xff1a; 项目从需求到上线阶段的绝对主力&#xff0c;确保项目的正常迭代与风险把控&#xff1b;代码质量和性能的保证者&#xff1b; 素质要求&#xff1a; 拥有良好的沟通和协调能力&#xff0c;能够清晰地传达目标、任务和进展情况&#xff0c;并及时解决沟通障…

R语言绘图 --- 饼状图(Biorplot 开发日志 --- 2)

「写在前面」 在科研数据分析中我们会重复地绘制一些图形&#xff0c;如果代码管理不当经常就会忘记之前绘图的代码。于是我计划开发一个 R 包&#xff08;Biorplot&#xff09;&#xff0c;用来管理自己 R 语言绘图的代码。本系列文章用于记录 Biorplot 包开发日志。 相关链接…

JDBC入门基础

目录 JDBC的基本概念 快速入门&#xff08;基本步骤&#xff09; 创建数据库 注册驱动&#xff08;可以省略不写&#xff09; 获取连接对象 获取执行SQL语句的对象 编写SQL语句&#xff0c;并执行&#xff0c;以及接收返回的结果 处理结果&#xff0c;遍历结果集和 释放资源&…

数据流通与智能家居的未来

在科技飞速发展的今天&#xff0c;智能家居逐渐融入我们的日常生活&#xff0c;改变了传统的居住方式。智能生态网络&#xff08;IEN&#xff09;作为智能家居的核心&#xff0c;集成了家庭内的各种智能设备和传感器&#xff0c;实现了对家庭环境的智能化管理。而数据要素流通则…

ESP32入门:1、VSCode+PlatformIO环境搭建(离线快速安装)

文章目录 背景安装vscode安装配置中文 安装Platform IO安装PIO 新建ESP32工程参考 背景 对于刚接触单片机的同学&#xff0c;使用vscodeplatformIO来学习ESP32是最方便快捷的&#xff0c;比IDF框架简单&#xff0c;且比arduino文件管理性能更好。但是platformIO安装较为麻烦&a…

C动态编程语言:深入剖析其特性与潜力

C动态编程语言&#xff1a;深入剖析其特性与潜力 在编程语言的浩瀚海洋中&#xff0c;C语言以其独特的魅力吸引着无数开发者。然而&#xff0c;当我们提及C作为动态编程语言时&#xff0c;可能会引发一些困惑和争议。毕竟&#xff0c;C语言通常被视为一种静态类型、过程式的编…

如何查看Kafka数据文件中的 .log .index .timeindex 文件内容

如何查看 在 kafka 目录下执行指令&#xff1a; kafka/bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.log --print-data-log# 将00000000000000000000.log替换为要查看的.log .index .timeindex文件即可结果如下&#xff1a; kafka/b…

电子阅览室能给孩子做什么

电子阅览室为孩子提供了很多活动和资源&#xff0c;可以为他们提供以下服务&#xff1a; 1. 提供电子书籍和儿童读物&#xff1a;电子阅览室通常提供大量的电子书籍和儿童读物&#xff0c;供孩子选择阅读。 2. 提供儿童学习资源&#xff1a;专久智能电子阅览室可以提供各种学习…

CraftCMS ConditionsController.php 代码执行漏洞(CVE-2023-41892)

0x01 产品简介 Craft CMS是一个开源的内容管理系统,它专注于用户友好的内容创建过程,逻辑清晰明了,是一个高度自由,高度自定义设计的平台吗,可以用来创建个人或企业网站也可以搭建企业级电子商务系统。 0x02 漏洞概述 Craft CMS在4.4.15版本之前存在远程代码执行漏洞,…

代码随想录算法训练营day24|回溯理论基础、77.组合

回溯理论基础 带你学透回溯算法&#xff08;理论篇&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 回溯算法是一种试探性的算法&#xff0c;用于解决组合优化问题。这类问题通常涉及在给定的候选集中找出满足特定条件的所有解。回溯算法通过深度优先遍历的方式&#…

【数据结构与算法|栈篇】中缀表达式转变为后缀表达式

1. 前言 假设我们已经知道中缀表达式和后缀表达式的概念. 我们可以用符号栈来实现中缀表达式向后缀表达式的转变. 2. 符号栈实现中缀表达式转变为后缀表达式 (1). 思路 我们设计了可变字符串与符号栈. 如果传入的字符串的字符是数字字符&#xff0c;则直接将该字符append到…

[论文笔记]MemGPT: Towards LLMs as Operating Systems

引言 今天介绍一篇论文MemGPT: Towards LLMs as Operating Systems。翻过过来就是把LLM看成操作系统。 大语言模型已经在人工智能领域引起了革命性的变革&#xff0c;但受到有限上下文窗口的限制&#xff0c;在扩展对话和文档分析等任务中的效用受到了阻碍。为了能够利用超出…

4月啤酒品类线上销售数据分析

近期&#xff0c;中国啤酒行业正处于一个重要的转型期。首先&#xff0c;消费者对高品质啤酒的需求不断增加&#xff0c;这推动了行业向高端化、场景化和社交化的方向发展。精酿啤酒作为这一趋势的代表&#xff0c;其发展势头强劲&#xff0c;不仅满足了消费者对品质化、个性化…

Ubuntu下搭建与配置PPPoE server

1.安装pppoe sudo apt-get install pppoe #查看帮助与版本号&#xff08;本文基于Version 3.12&#xff09; pppoe-server -h2.修改配置文件 主要包括/etc/ppp/options 、/etc/ppp/pppoe-server-options 、/etc/ppp/chap-secrets三个文件 /etc/ppp/options &#xff1a; #设…