2024.1.17 网络编程 作业

思维导图

练习题

广播服务器端

#include <myhead.h>int main(int argc, char const *argv[])
{//创建套接字int sfd = socket(AF_INET, SOCK_DGRAM, 0);//填充网络信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET;cin.sin_port = htons(6789);cin.sin_addr.s_addr = inet_addr("192.168.124.255");//绑定bind(sfd, (struct sockaddr *)&cin, sizeof(cin));char buf[128] = "";//接收广播消息while (1){memset(buf, 0, sizeof(buf));recvfrom(sfd, buf, sizeof(buf), 0, NULL, NULL);printf("接收到的消息:%s\n",buf);}//关闭套接字close(sfd);return 0;
}

广播客户端

#include <myhead.h>int main(int argc, char const *argv[])
{//创建套接字int sfd = socket(AF_INET, SOCK_DGRAM, 0);//将套接字设置成允许广播int broadcase = 1;if (setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &broadcase, sizeof(broadcase)) == -1){perror("setsockopt error");return -1;}//填充网络信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET;cin.sin_port = htons(6789);cin.sin_addr.s_addr = inet_addr("192.168.124.255");//绑定非必要//bind(sfd, (struct sockaddr *)&cin, sizeof(cin));char buf[128] = "";//发送广播消息while (1){memset(buf, 0, sizeof(buf));printf("请输入--->");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';//发送到广播地址中去sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, sizeof(cin));printf("发送成功\n");}close(sfd);return 0;
}

组播服务器端

#include <myhead.h>int main(int argc, char const *argv[])
{//创建套接字int rfd = socket(AF_INET, SOCK_DGRAM, 0);if (rfd == -1){perror("socket error");return -1;}//设置网络属性struct ip_mreqn im;im.imr_multiaddr.s_addr = inet_addr("224.1.2.3");im.imr_address.s_addr = inet_addr("192.168.125.193");im.imr_ifindex = 2;if (setsockopt(rfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &im, sizeof(im)) == -1){perror("setsockopt error");return -1;}puts("加入多播组成功");//填充地址信息结构体struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_port = htons(9999);rin.sin_addr.s_addr = inet_addr("224.1.2.3");//绑定if (bind(rfd, (struct sockaddr *)&rin, sizeof(rin)) == -1){perror("绑定成功");return -1;}puts("绑定成功");//接收消息char buf[128]="";while(1){memset(buf,0,sizeof(buf));recvfrom(rfd,buf,sizeof(buf),0,0,0);printf("收到消息为:%s\n",buf);}//关闭套接字close(rfd);return 0;
}

组播客户端

#include <myhead.h>int main(int argc, char const *argv[])
{//创建套接字int sfd = socket(AF_INET, SOCK_DGRAM, 0);if (sfd == -1){perror("socket error");return -1;}//发送端不用设置网络属性//填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(9999);sin.sin_addr.s_addr = inet_addr("224.1.2.3");//绑定非必要/*if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("绑定成功");return -1;}puts("绑定成功");*///发送消息char buf[128] = "";while (1){memset(buf, 0, sizeof(buf));fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = 0;//发送给指定IP端口sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, sizeof(sin));printf("收到消息为:%s\n", buf);}//关闭套接字close(sfd);return 0;
}

流式域套接字

      服务器端

#include <myhead.h>int main(int argc, const char *argv[])
{//1、创建套接字int sfd = socket(AF_UNIX, SOCK_STREAM, 0);//int sfd = socket(AF_UNIX, SOCK_RAW, IPPROTO_TCP);if (sfd == -1){perror("socket error");return -1;}//由于域套接字的绑定函数,只能绑定一个不存在的套接字文件//所以,在绑定之前需要判断当前文件是否存在if (access("./unix", F_OK) == 0){//表示文件存在,删除该文件if (unlink("./unix") == -1){perror("unlink error");return -1;}}//2、填充地址信息结构体struct sockaddr_un sun;sun.sun_family = AF_UNIX; //通信域//sun.sun_path = ".unix";            //字符串赋值不能使用赋值运算符strcpy(sun.sun_path, "./unix"); //绑定套接字文件//3、绑定地址信息结构体if (bind(sfd, (struct sockaddr *)&sun, sizeof(sun)) == -1){perror("bind error");return -1;}printf("bind success\n");//4、监听if (listen(sfd, 128) == -1){perror("listen error");return -1;}//5、阻塞接收客户端链接请求//定义容器接收客户端地址信息结构体struct sockaddr_un cun;socklen_t socklen = sizeof(cun);int newfd = accept(sfd, (struct sockaddr *)&cun, &socklen); //表示不接收客户端地址信息if (newfd == -1){perror("accept error");return -1;}//6、收发数据char buf[128] = "";while (1){//清空数组bzero(buf, sizeof(buf));int res = recv(newfd, buf, sizeof(buf), 0); //读取消息if (res == 0){printf("客户端已经下线\n");break;}printf("[%s]: %s\n", cun.sun_path, buf);}//7、关闭套接字close(newfd);close(sfd);return 0;
}

         客户端

#include <myhead.h>int main(int argc, char const *argv[])
{//创建套接字int cfd = socket(AF_UNIX, SOCK_STREAM, 0);if (cfd == -1){perror("socket error");return -1;}//判断Linux文件是否存在if (access("./linux", F_OK) == 0){if (unlink("./linux") == -1){perror("unlink error");return -1;}}//填充信息结构体struct sockaddr_un cun;cun.sun_family = AF_UNIX;strcpy(cun.sun_path, "./linux");//绑定信息结构体if (bind(cfd, (struct sockaddr *)&cun, sizeof(cun)) == -1){perror("bind error");return -1;}puts("bind success");//连接服务器//填充服务器地址信息结构体struct sockaddr_un sun;sun.sun_family = AF_UNIX;strcpy(sun.sun_path, "./unix");//连接服务器connect(cfd, (struct sockaddr *)&sun, sizeof(sun));//收发数据char buf[128] = "";while (1){//清空数组memset(buf, 0, sizeof(buf));//获取消息内容fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = 0;//发送消息send(cfd, buf, sizeof(buf), 0);printf("发送成功\n");if (strcmp(buf, "quit") == 0){break;}}//关闭套接字close(cfd);return 0;
}

报式域套接字

      服务器端

#include<myhead.h>int main(int argc, const char *argv[])
{//创建套接字int sfd = socket(AF_UNIX, SOCK_DGRAM, 0);if(sfd == -1){perror("socket error");return -1;}printf("sfd = %d\n", sfd);//由于域套接字的绑定函数,只能绑定一个不存在的套接字文件//所以,在绑定之前需要判断当前文件是否存在if(access("./linux", F_OK) == 0){   //表示文件存在,删除该文件if(unlink("./linux")==-1){perror("unlink error");return -1; }}     // 填充地址信息结构体struct sockaddr_un sun;sun.sun_family = AF_UNIX;strcpy(sun.sun_path, "./linux");// 绑定工作if(bind(sfd, (struct sockaddr*)&sun, sizeof(sun)) == -1){perror("bind error");return -1;}//数据收发char buf[128] = "";//定义变量存放客户端地址信息结构体struct sockaddr_un cun;socklen_t socklen = sizeof(cun);while(1){//清空数组bzero(buf, sizeof(buf));//从套接字文件中读取消息recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cun, &socklen);printf("[%s]:%s\n", cun.sun_path, buf);//将字符串连接后回发strcat(buf, "*.*");//if(write(sfd, buf, sizeof(buf)) == -1)if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cun, sizeof(cun)) == -1){perror("sendto error");return -1;}printf("发送成功\n");}//4、关闭套接字close(sfd);return 0;
}

         客户端

#include <myhead.h>int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_UNIX, SOCK_DGRAM, 0);if (cfd == -1){perror("socket error");return -1;}//由于域套接字的绑定函数,只能绑定一个不存在的套接字文件//所以,在绑定之前需要判断当前文件是否存在if (access("./unix", F_OK) == 0){//表示文件存在,删除该文件if (unlink("./unix") == -1){perror("unlink error");return -1;}}//2、绑定//2.1 填充地址信息结构体struct sockaddr_un cun;cun.sun_family = AF_UNIX;strcpy(cun.sun_path, "./unix");//2.2 绑定工作if (bind(cfd, (struct sockaddr *)&cun, sizeof(cun)) == -1){perror("bind error");return -1;}//3、填充服务器的地址信息结构体struct sockaddr_un sun;sun.sun_family = AF_UNIX;strcpy(sun.sun_path, "./linux");//4、数据收发char buf[128] = "";while (1){printf("请输入>>>");fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = '\0';//发送给服务器sendto(cfd, buf, sizeof(buf), 0, (struct sockaddr *)&sun, sizeof(sun));if (strcmp(buf, "quit") == 0){break;}//接收服务器发送来的消息recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);printf("收到消息:%s\n", buf);}//5、关闭套接字close(cfd);return 0;
}

使用TFTP协议完成客户端的文件上传下载功能

#include <myhead.h>
int fileonload(int sockfd)
{int sfd = sockfd;printf("上传的文件:");char file[64];scanf("%s", file);//打开文件用于读取上传文件的数据int send_fd = -1;if ((send_fd = open(file, O_RDONLY)) == -1){perror("open error:");return -1;}//填充信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(69);sin.sin_addr.s_addr = inet_addr("192.168.125.60");socklen_t socklen = sizeof(sin);//封装请求下载数据包//第一块
}
int main(int argc, char const *argv[])
{// 创建套接字UDP通信int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("socket error");return -1;}// 填充服务器网络信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;//端口号填69sin.sin_port = htons(69);//填写windows ip地址sin.sin_addr.s_addr = inet_addr("192.168.125.60");//结构体长度socklen_t socklen = sizeof(sin);//数据包数据的长度以512字节传输char buffer[516] = {0};//返回的ACKchar ack[4];//操作码short code = 0;//块编号 or 错误码short BlockoErr = 0;//数据的长度以512Byte传输char text[512] = {0}; //文件内容 或 错误信息//校验收到的块编号int N = 0;//返回的文件描述符int fd;int ret = 0;//文件名char filename[64] = {0};while (1){int chose = 0;puts("1.下载");puts("2.上传");puts("3.退出");scanf("%d", &chose);switch (chose){case 1:memset(filename, 0, sizeof(filename));//输入文件名printf("下载文件名: ");scanf("%s", filename);//使用 sprintf 组包//返回成功格式化字符的个数  01下载操作 10上传操作ret = sprintf(buffer, "%c%c%s%c%s%c", 0, 1, filename, 0, "octet", 0);//首次发送请求if (-1 == sendto(sockfd, buffer, ret, 0, (struct sockaddr *)&sin, socklen)){perror("sendto error");return -1;}//循环接收服务器发来的数据包while (1){//因为有临时端口需要保存服务器的网络信息结构体ret = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&sin, &socklen);if (-1 == ret){perror("recvfrom error");return -1;}//解析操作码code = ntohs(*(short *)buffer);//解析块编号or错误码BlockoErr = ntohs(*(short *)(buffer + 2));//解析文件内容or错误信息,并将内容放入数据段strncpy(text, buffer + 4, sizeof(text));//解析数据包中的内容if (3 == code && BlockoErr == N + 1){//校验块编号+1N++;//要接收的数据包//如果是第一次接到数据包 要创建文件if (BlockoErr == 1){fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0664);if (-1 == fd){perror("open error");}}//将文件内容写入文件 留出4字节if (-1 == write(fd, text, ret - 4)){perror("write error");}// 组装ACK*(short *)ack = htons(4);*(short *)(ack + 2) = htons(BlockoErr);//回复ACK包if (-1 == sendto(sockfd, ack, 4, 0, (struct sockaddr *)&sin, socklen)){perror("recvfrom error");}//文件接收完毕if (ret < 512)break;}}printf("文件[%s]下载完成\n", filename);close(sockfd);break;case 2:memset(filename, 0, sizeof(filename));//输入文件名printf("上传文件名: ");scanf("%s", filename);int upfd = -1;if ((upfd = open(filename, O_RDONLY)) == -1){perror("open error:");return -1;}short *p1 = (short *)buffer;*p1 = htons(2);//第二模块char *p2 = buffer + 2;strcpy(p2, filename);//第三模块char *p3 = p2 + strlen(p2) + 1;strcpy(p3, "octet");int len = 4 + strlen(p2) + strlen(p3);sendto(sockfd, buffer, len, 0, (struct sockaddr *)&sin, sizeof(sin));char *data_point = buffer + 4;short *cmd_point = (short *)buffer;*cmd_point = htons(3);short *block_point = (short *)(buffer + 2);*block_point = htons(1);int i = 1;while (1){recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&sin, &socklen);if (*cmd_point == htons(4)){int res = read(upfd, buffer + 4, 512);if (res == 0){break;}*cmd_point = htons(3);sendto(sockfd, buffer, res + 4, 0, (struct sockaddr *)&sin, socklen);}}printf("文件[%s]上传完成\n", filename);close(sockfd);break;case 3:exit(0);default:puts("error");}}return 0;
}

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

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

相关文章

Rxjava链式调用解析

本文以下面代码为例逐步解析 Observable.just("数据源").map(new Function<String, Integer>() {Overridepublic Integer apply(String s) throws Exception {return 1;}}).filter(integer -> {return integer 1;}).subscribeOn(Schedulers.io()).observe…

element-ui表单验证同时用change与blur一起验证

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 当审批时不通过审批意见要必须输入&#xff0c; 1&#xff1a;如果用change验证的话删除所有内容时报错是massage的提示&#xff0c;但是在失去焦点的时候报错就成了英文&#xff0c;如下图&#xf…

SQL语句详解四-DQL(数据查询语言-多表查询一)

文章目录 表和表的关系一对一关系一对多、多对一关系多对多关系 表和表的关系 概述&#xff1a;数据库中表的关系有三种&#xff0c;一对一关系、一对多的关系、多对多的关系。 一对一关系 例如&#xff1a;一个人只能有一个身份证号&#xff0c;一个身份证号只属于一个人 示…

STM32F103标准外设库——RCC时钟(六)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

PyQt5零基础入门(四)——信号与槽

信号与槽 前言信号与槽单对单直接连接使用lambda表达式 信号与槽多对多一个信号连接多个槽多个信号连接一个槽信号与信号连接 自定义信号 前言 PyQt5的信号与槽是一种对象之间的通信机制&#xff0c;允许一个QObject对象发出信号&#xff0c;与之相连接的槽函数将会自动执行。…

漏洞复现-科荣AIO UtilServlet任意命令执行漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

【MySQL】管理用户

DCL-管理用户 查询用户 use mysql; select * from user;创建用户 create user 用户名主机名 identified by 密码;修改用户密码 alter user 用户名主机名 identidied with mysql_native_password by 新密码;删除用户 drop user 用户名主机名;创建用户test&#xff0c;只能够…

地震预测系统项目实现

整个项目思路即在一组观测数据中&#xff0c;地震专家&#xff08;即用户&#xff09;输入观测窗口的最小数量和最大数量&#xff0c;进行预测峰值点 数据文件如图所示&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<fstream> #include<string> #include&…

CSS 设置背景图片

文章目录 设置背景颜色设置背景图片背景图片偏移量计算原点背景图片尺寸设置背景图片位置设置背景图片重复方式设置背景范围设置背景图片是否跟随元素移动测试背景图片 本文概念部分参考&#xff1a;CSS背景background设置 设置背景颜色 background-color 设置背景颜色 设置…

当我们谈上下文切换时我们在谈些什么

相信不少小伙伴面试时&#xff0c;都被问到过这样一个问题&#xff1a;进程和线程的区别是什么&#xff1f;大学老师会告诉我们&#xff1a;进程是资源分配的基本单位&#xff0c;线程是调度的基本单位。说到调度&#xff0c;就不得不提到CPU的上下文切换了。 何为CPU上下文切换…

香港服务器托管:你对服务器托管了解多少?

在当今数字化的时代&#xff0c;服务器托管已成为企业和网站运营的关键一环。对于许多企业来说&#xff0c;如何选择一个安全、稳定、高效的服务器托管方案&#xff0c;成为了确保业务连续性和数据安全的重要课题。那么&#xff0c;究竟什么是服务器托管&#xff0c;它又有哪些…

使用WAF防御网络上的隐蔽威胁之扫描器

在网络安全领域&#xff0c;扫描器是用于侦察和识别网络系统漏洞的工具。 它们可以帮助网络管理员识别安全漏洞&#xff0c;也可能被攻击者用来寻找攻击目标。 扫描器的基本概念 定义&#xff1a;扫描器是一种自动化工具&#xff0c;用于探测网络和服务器中的漏洞、开放端口、…

手机崩溃日志的查找与分析

手机崩溃日志的查找与分析 摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具&#xff0c;该工具可以方便地查看iPhone设备上应用和系统运行时的实时日志和崩溃日志。同时还提供了崩溃日志的分析查看模块&#xff0c;可以对苹果崩溃日志进行符号化、格式化和分析&#x…

统计学R语言 实验3 点估计

统计学R语言 实验3 点估计 一、实验目的 1. 掌握理解点估计的相关概念和方法。 2. 掌握理解点估计的估计质量好坏判断方法。 3. 熟悉R语言等语言的集成开发环境。 二、实验分析与内容 某灯泡厂从某日生产的一批灯泡中抽取10个灯泡进行寿命试验&#xff0c;得到灯泡寿命&…

leetocode 15 三数之和

题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例…

Linux网络引导自动安装centos7

目录 一、部署PXE远程安装服务 1. 系统装机的三种引导方式 2. pxe概述 3. 实现过程 4. 搭建过程中服务介绍 4.1 TFTP服务 4.2 vsftp&#xff1a;安装系统镜像文件获取方式 4.3 syslinux 4.4 DHCP服务 5. 操作过程 二、实现Kickstart无人值守安装 1. 安装Kickstart图…

计算机三级(网络技术)——应用题

第一题 61.输出端口S0 &#xff08;直接连接&#xff09; RG的输出端口S0与RE的S1接口直接相连构成一个互联网段 对172.0.147.194和172.0.147.193 进行聚合 前三段相同&#xff0c;将第四段分别转换成二进制 11000001 11000010 前6位相同&#xff0c;加上前面三段 共30…

AI图片物体移除器:高效、便捷的AI照片物体擦除工具

在我们的日常生活中&#xff0c;照片是一种重要的记录和表达方式。然而&#xff0c;有时候我们会遇到需要将照片中的某些物体和元素去除的情况。这时候&#xff0c;传统的图像处理软件可能过于复杂&#xff0c;让人望而却步。为了解决这个问题&#xff0c;AI图片物体移除器的软…

运筹说 第104期 | 2023全球高被引科学家名单发布!

2023年11月15日&#xff0c;全球领先的专业信息服务提供商科睿唯安发布2023年度“全球高被引科学家”名单&#xff0c;遴选全球高校、研究机构和商业组织中对所在研究领域具有重大和广泛影响的顶尖科学人才。最终&#xff0c;来自全球67个国家和地区1300多个机构的6849名科学家…