2024-2-29-网络编程作业

1>TCP

源代码:

服务器端:

#include <myhead.h>
#define SER_IP "10.168.1.111"
#define SER_PORT 8888
#define MAXSIZE 128
int main(int argc, char const *argv[])
{int sfd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);bind(sfd, (struct sockaddr *)&sin, sizeof(sin));listen(sfd, 128);struct sockaddr_in cin;socklen_t socklen = sizeof(cin);int newfd = accept(sfd, (struct sockaddr *)&cin, &socklen);printf("客户端IP:%s, 端口号为:%d\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));char rbuf[MAXSIZE] = "";while (1){bzero(rbuf, sizeof(rbuf));int res = recv(newfd, rbuf, sizeof(rbuf),0);if (res == 0){printf("客户端已经关闭\n");break;}printf("从IP为%s 端口为%d 接收到数据为:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);strcat(rbuf, "O.o");send(newfd, rbuf, strlen(rbuf),MSG_DONTWAIT);}close(newfd);close(sfd);return 0;
}

客户端:

#include <myhead.h>
#define SER_IP "10.168.1.111"
#define SER_PORT 8888
#define MAXSIZE 128
int main(int argc, char const *argv[])
{int cfd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);connect(cfd, (struct sockaddr *)&sin, sizeof(sin));char wbuf[MAXSIZE] = "";while (1){bzero(wbuf, sizeof(wbuf));printf("请输入>>>\n");fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf) - 1] = 0;send(cfd, wbuf, strlen(wbuf), 0);printf("send success\n");if (strcmp(wbuf, "quit") == 0){break;}bzero(wbuf, sizeof(wbuf));recv(cfd, wbuf, sizeof(wbuf), 0);printf("收到消息为:%s\n", wbuf);}close(cfd);return 0;
}

效果图

2>UDP

源代码:

服务器端

#include <myhead.h>
#define SER_IP "10.168.1.111"
#define SER_PORT 8888
#define MAXSIZE 128
int main(int argc, char const *argv[])
{int sfd = socket(AF_INET, SOCK_DGRAM, 0);struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);bind(sfd, (struct sockaddr *)&sin, sizeof(sin));char rbuf[MAXSIZE] = "";struct sockaddr_in cin;socklen_t socklen = sizeof(cin);while (1){bzero(rbuf, sizeof(rbuf));recvfrom(sfd, rbuf, sizeof(rbuf), 0, (struct sockaddr *)&cin, &socklen);printf("接受到的消息为:%s\n", rbuf);strcat(rbuf, "o.O");sendto(sfd, rbuf, strlen(rbuf), 0, (struct sockaddr *)&cin,socklen);printf("发送成功\n");}close(sfd);return 0;
}

客户端:

#include <myhead.h>
#define SER_IP "10.168.1.111"
#define SER_PORT 8888
#define MAXSIZE 128
int main(int argc, char const *argv[])
{int cfd = socket(AF_INET, SOCK_DGRAM, 0);struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);char wbuf[MAXSIZE] = "";while (1){bzero(wbuf, sizeof(wbuf));printf("请输入>>>:");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1] = 0;sendto(cfd, wbuf, sizeof(wbuf), 0, (struct sockaddr *)&sin, sizeof(sin));printf("发送成功\n");bzero(wbuf,sizeof(wbuf));recvfrom(cfd, wbuf, sizeof(wbuf), 0, NULL,NULL);printf("接受到的消息为:%s\n", wbuf);}close(cfd);return 0;
}

效果图:

3>思维导图

4>面试题整理

1.标准IO的实现

通过操作句柄FILE*类型的指针,使用fopen、fclose、fgets等函数来操作文件。在操作过程中,有一个缓冲区,先将要输入或输出的数据,放入缓冲区后,等到缓冲区刷新时机到了后,统一调用内核提供的函数,将数据刷入内核空间,经由内核空间做后续操作。

2.什么是进程?

进程是程序的一次执行过程,是资源分配的基本单位,每个进程会被分配4Gd的虚拟内存,调度机制为:时间片轮询、上下文切换,有一定的生命周期:创建态-->就绪态-->阻塞态-->运行态-->终止态

3.如何将程序执行直接运行于后台?

a.out 后加 &

4.共享内存通信原理

是多个进程之间的通信,共享内存是将独立于多个进程之外的物理内存,分别映射到不同的进程中,其中一个进程对其进行修改,另一个进程也跟着修改;共享内存中的数据的读写不是一次性的,写入共享内存中的数据,被读取后,依然存在,直到下一次写入的数据将其覆盖;共享内存的操作时,由于共享内存段,相对于多个进程属于临界资源,所以对该资源的使用,需要使用同步机制

5.TCP/IP四层网络通信结构?

网络接口层-->网际层-->运输层-->应用层

6.TCP服务器通信流程

创建套接字-->绑定服务器地址信息结构体-->设置被动监听-->阻塞等待客户端的连接-->数据收发-->关闭套接字

7.路由器位于哪一层?

网际层

8.交换机在哪一层?

网络接口层

9.static的用法

作用:static静态变量

1.static修饰的变量内存在静态区

2.static修饰全局变量:static修饰为初始化的全局变量默认结果为0

3.static修饰局部变量:

延长生命周期(内存的申请到释放),延长至整个文件,类似全局,不是作用域。

static修饰未初始化的局部变量,默认结果为0

4.static修饰函数:static修饰函数,生命周期在本文件有效,不可以跨文件调用

5.static修饰指针:

不可以使用staic修的指针指向auto类型的变量地址。

因为计算机先为static类型变量分配内存,后分配auto类型的变量,不允许使用已存在的变量,指向未知的变量地址。

10.const的用法

修饰的变量不可变。修饰普通变量时,相当于常量,且需要初始化;修饰函数参数时,不管是什么数据类型,也不管是 指针传递,还是 引用传递,只要加了 const 修饰,就可以防止函数内意外修改该参数,起到保护作用;用 const 修饰返回的指针或引用,保护指针或引用的内容不被修改。

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

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

相关文章

RDD简介与基础编程

1. 什么是RDD&#xff1f; RDD&#xff08;Resilient Distributed Dataset&#xff09;叫做弹性分布式数据集&#xff0c;是Spark中最基本的数据处理模型。在代码中&#xff0c;RDD是一个抽象类&#xff0c;他代表着一个弹性的、不可变的、可分区的、里面的元素可并行计算的集…

android TextView 实现富文本显示

android TextView 实现富文本显示&#xff0c;实现抖音直播间公屏消息案例 使用&#xff1a; val tvContent: TextView helper.getView(R.id.tvContent)//自己根据UI业务要求&#xff0c;可以控制 图标显示 大小val levelLabel MyImgLabel( bitmap 自己业务上的bitmap )va…

第零章_计算机导论

0.1 计算机&#xff1a;辅助人脑的好工具 所谓的计算机就是一种计算器&#xff0c;而计算器其实是:『接受用户输入指令与数据&#xff0c;经由中央处理器的数学与逻辑单元运算处理后&#xff0c;以产生或储存成有用的信息』。因此&#xff0c;只要有输入设备(不管是键盘还是触摸…

HTML5:七天学会基础动画网页4

backgorund-size 值与说明 length(单位像素):设置背景图片高度和宽度&#xff0c;第一个值设置宽度&#xff0c;第二个值设置高度&#xff0c;如果只给出一个值&#xff0c;第二个是设置为auto。 percentage(百分比):以父元素的百分比来设置背景图像的宽度和高度&#xff0c…

CSS技巧:实现两个div在同一行显示的方法

css如何让两个div在同一行显示 - web开发 - 亿速云 在Web开发中&#xff0c;经常遇到需要将多个元素水平排列在同一行的情况。其中一个常见的需求是将两个div元素放置在同一行上&#xff0c;使它们并排显示。在本文中&#xff0c;我们将介绍几种实现这一效果的CSS方法。 1. 使…

day06_菜单管理(查询菜单,添加菜单,添加子菜单,修改菜单,删除菜单,角色分配菜单,查询菜单,保存菜单,动态菜单)

文章目录 1 菜单管理1.1 表结构介绍1.2 查询菜单1.2.1 需求说明1.2.2 页面制作1.2.3 后端接口SysMenuSysMenuControllerSysMenuServiceMenuHelperSysMenuMapperSysMenuMapper.xml 1.2.4 前端对接sysMenu.jssysMenu.vue 1.3 添加菜单1.3.1 需求说明1.3.3 页面制作1.3.3 后端接口…

腾讯云安装MYSQL远程连接不上解决方案

推荐安装步骤博客&#xff0c;写的很详细&#xff0c;如果不会安装的话&#xff0c;可以根据安装步骤一直走。 Windows10下超详细Mysql安装_win10安装mysql-CSDN博客 修改 my.cnf或者my.ini 找到里面bind-address将bind-address 127.0.0.1设置成bind-address 0.0.0.0&#x…

AI英语学习助手-帮助建立词库和句子-极简安装(python基于Django和 OpenAI GPT API的网站程序)

AI英语学习助手-帮助建立词库和句子-极简安装&#xff08;python基于Django和 OpenAI GPT API的网站程序&#xff09; 学了很久的英语&#xff0c;但是发现还是被单词困住了&#xff0c;天天查句子查单词太麻烦&#xff0c;现在有了Chat GPT&#xff0c;能够很好得帮助学习英语…

CSP-202109-2-非零段划分

CSP-202109-2-非零段划分 【70分思路-暴力枚举】 这段代码的目的是在给定一个由自然数&#xff08;非负整数&#xff09;组成的数组后&#xff0c;通过选择一个适当的正整数 p&#xff0c;将数组中所有小于 p 的数变为 0&#xff0c;从而使得数组中非零段的数量达到最大。这里…

使用 gma 绘制隋唐洛阳城

背景 最近河南文旅大伙&#xff0c;给家乡带了一波热度&#xff0c;想想又是王子又是公主&#xff0c;着实羡慕。出门在外&#xff0c;还是对加很有感觉得&#xff0c;不过很遗憾&#xff0c;本人不能为家乡做出贡献&#xff0c;只能使用这种小伎俩&#xff0c;稍稍展示&#…

【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器

目录 一、网络编程 二、客户端和服务器 三、客户端和服务器的交互模式 四、TCP 和 UDP UDP socket api 的使用 1、DatagramSoket 2、DatagramPacket TCP socket api 的使用 1、ServerSocket 2、Socket 一、网络编程 本质上就是学习传输层给应用层提供的 api&#x…

ARM简介

ARM&#xff1a;ARM是Advanced RISC Machine的缩写&#xff0c;意为高级精简指令集计算机。 英国ARM公司&#xff0c;2016年被软银创始人孙正义斥资320亿美元收购了。现在是软银旗下的芯片设计公司&#xff0c;总部位于英国剑桥&#xff0c;专注于设计芯片&#xff0c;卖芯片生…

揭秘:头部房企如何借助数据分析实现稳健发展?

房地产行业是我国国民经济中的重要支柱产业之一&#xff0c;在房地产市场供求关系发生重大变化的当下&#xff0c;房企面临多重挑战。Kyligence 服务的这家头部房企把发展的重点聚焦于内生&#xff0c;关注内生的转化率、接管的效率以及内生毛利率的提升&#xff0c;引入 Kylig…

基于springboot实现保险信息网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现保险信息网站系统演示 摘要 随着互联网的不断发展&#xff0c;现在人们获取最新资讯的主要途径来源于网上新闻&#xff0c;当下的网上信息宣传门户网站的发展十分的迅速。而保险产品&#xff0c;作为当下人们非常关注的一款能够给人们带来医疗、生活、养老或…

面试笔记系列七之多线程+分布式系统基础知识点整理及常见面试题

目录 多线程 介绍一下线程的生命周期及状态&#xff1f; 线程的sleep、wait、join、yield如何使用&#xff1f; sleep与yield方法的区别在于&#xff0c; 进程调度算法 创建线程有哪些方式&#xff1f; 什么是守护线程&#xff1f; ThreadLocal的原理是什么&#xff0c;…

当大语言模型遇到AI绘画-google gemma与stable diffusion webui融合方法-矿卡40hx的AI一体机

你有想过建一台主机&#xff0c;又能AI聊天又能AI绘画&#xff0c;还可以直接把聊天内容直接画出来的机器吗&#xff1f; 当Google最新的大语言模型Gemma碰到stable diffusion webui会怎么样&#xff1f; 首先我们安装stable diffusion webui(automatic1111开源项目&#xff…

微信小程序构建npm失败解决方式

安装完所需要的依赖后&#xff0c;在微信开发者工具菜单栏中选择&#xff1a;“工具” -> “构建 npm”&#xff0c;但是失败。 解决方法&#xff1a;修改 project.config.json 开发者工具创建的项目&#xff0c;miniprogramRoot 默认为 miniprogram&#xff0c;package.js…

数据迁移DTS | 云上MySQL 数据库迁移至达梦数据库

引入 云上 MySQL 数据库 —> 向达梦国产化数据库迁移 下载&安装 达梦客户端工具 DM->可参考之前国产化专栏达梦文章 创建模式 在客户端分别依次执行以下命令脚本&#xff08;这里没有通过客户端管理工具去创建达梦数据库的模式&#xff0c;当然也可以通过图形化界…

WordPress通过宝塔面板的入门安装教程【保姆级】

WordPress安装教程【保姆级】【宝塔面板】 前言一&#xff1a;安装环境二&#xff1a;提前准备三&#xff1a;域名解析四&#xff1a;开始安装五&#xff1a;安装成功 前言 此教程适合新手&#xff0c;即使不懂代码&#xff0c;也可轻松安装wordpress 一&#xff1a;安装环…

视频在线转换,四种方法任你选!(建议收藏)

在当今的数字时代&#xff0c;视频已经成为人们日常生活中不可或缺的一部分。我们通过视频分享知识、表达创造力、观看娱乐节目&#xff0c;甚至参与远程学习和工作。然而&#xff0c;随着视频格式的多样化和设备的激增&#xff0c;我们经常会遇到一个常见的问题&#xff1a;视…