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,一经查实,立即删除!

相关文章

代码随想录算法训练营|day47

第九章 动态规划 198.打家劫舍213.打家劫舍II337.打家劫舍III代码随想录文章详解 198.打家劫舍 dp[i]表示偷第i家及之前所能获取的最大金额 偷第i家&#xff1a;dp[i] dp[i-2]nums[i]&#xff0c;不偷第i家&#xff1a;dp[i] dp[i-1] func rob(nums []int) int {if len(num…

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;只要有输入设备(不管是键盘还是触摸…

UE5基于RumtimeFBXImport插件使用C++加载服务器上fbx文件方法

UE5的RumtimeFBXImport插件其实只能加载本机的fbx文件&#xff0c;要加载服务器上的fbx文件的话&#xff0c;需要先将该fbx文件下载到本地&#xff0c;然后再使用RumtimeFBXImport插件加载。 示例文件如下&#xff1a; #include "Loader/WebLoader.h" #include &quo…

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

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

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

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

TypeScript基础知识:类型推导和上下文类型化

在 TypeScript 中&#xff0c;类型推导和上下文类型化是两个重要的概念。它们使得代码编写更加简洁、可读性更高&#xff0c;并且帮助我们避免冗余的类型注解。本文将深入探讨这两个概念&#xff0c;并通过示例代码演示它们的用法和好处。 一、类型推导 类型推导是 TypeScript…

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 后端接口…

【git随笔,日常积累】

Git常用基础 branch 查看所有分支&#xff1a; git branch -a切换到分支&#xff1a;git checkout develop创建分支并切换到&#xff1a;git checkout -b develop创建一个新分支&#xff1a;git checkout --orphan new_branch --orphan 选项用于创建一个没有历史记录的分支 删…

腾讯云安装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…

Leetcode 128. 最长连续序列

最长连续序列 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&am…

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;…