嵌入式学习-网络编程-Day4

思维导图

Day4.png

广播通信模型

#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 sockaddr_in rin;rin.sin_family=AF_INET;rin.sin_port=htons(6789);rin.sin_addr.s_addr=inet_addr("192.168.123.255");//3绑定if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1){perror("bind error");return -1;}//接收消息char rbuf[128]="";while (1){//清空数组bzero(rbuf,sizeof(rbuf));//接受消息recvfrom(rfd,rbuf,sizeof(rbuf),0,0,0);printf("收到消息为:%s\n",rbuf);}//关闭套接字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;}//将套接字设置成允许广播int broadcast=1;if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast))==-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.123.255");//发送消息char sbuf[128]="";while(1){printf("请输入>>>");fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;//发送到广播地址sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&cin,sizeof(cin));}//关闭套接字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.122.60");//本机IPim.imr_ifindex=2;        //网络索引if((setsockopt(rfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&im,sizeof(im)))==-1){perror("setsockopt error");return -1;}printf("加入多播组成功\n");//填充地址信息结构体//绑定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("bind error");return -1;}//接收消息char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));recvfrom(rfd,rbuf,sizeof(rbuf),0,0,0);printf("收到消息为:%s\n",rbuf);}//关闭套接字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");char sbuf[128]="";while(1){printf("请输入>>>");fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));printf("发送成功\n");}close(sfd);return 0;
}

流式域套接字模型

#include <myhead.h>
int main(int argc, char const *argv[])
{//创建套接字int sfd=socket(AF_UNIX,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -1;}//由于域套接字的绑定函数,只能绑定一个不存在的套接字文件中//所以在绑定之前需要判断当前文件是否存在//判断文件是否存在函数if(access("./unix",F_OK)==0){//表示文件存在,删除该文件if(unlink("./unix")==-1){perror("unlink error");return -1;}}//填充地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./unix");//绑定地址信息结构体if((bind(sfd,(struct sockaddr*)&sun,sizeof(sun)))==-1){perror("bind error");return -1;}puts("bind success");//监听if(listen(sfd,128)==-1){perror("listen error");return -1;}//阻塞接受客户端的连接请求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;}//收发数据char buf[128]="";while(1){bzero(buf,sizeof(buf));int res=recv(newfd,buf,sizeof(buf),0);if(res==0){printf("客户端已经下线\n");}printf("[%s]:%s\n",cun.sun_path,buf);}//关闭套接字close(newfd);close(sfd);return 0;
}
#include <myhead.h>int main(int argc, const char *argv[])
{//1.创建套接字int cfd  = socket(AF_UNIX,SOCK_STREAM,0/*IPPROTO_TCP*/);if(cfd==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//2.绑定(随意)if(access("./linux",F_OK)==0){if(unlink("./lunix")==-1){perror("unlink error");return -1;}        }struct sockaddr_un cun;cun.sun_family=AF_UNIX;strcpy(cun.sun_path,"./lunix");if((bind(cfd,(struct sockaddr*)&cun,sizeof(cun)))==-1){perror("bind error");return -1;}    puts("bind success");//3.连接服务器//3.1填充地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./unix");//3.2链接if(connect(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("connect error");return -1;}printf("链接成功\n");//4.收发数据char buf[128]="";while(1){bzero(buf,sizeof(buf));printf("请输入>>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;//发送给服务器send(cfd,buf,sizeof(buf),0);printf("发送成功\n");if(strcmp(buf,"quit")==0){break;}}//5.关闭套接字close(cfd);return 0;
}

报式域套接字模型

#include <myhead.h>
#define SER_PORT 9999
#define SER_IP "192.168.122.36"int main(int argc, char const *argv[])
{//创建套接字int sfd=socket(AF_UNIX,SOCK_DGRAM,0);if(sfd==-1){perror("");return -1;}printf("sfd=%d\n",sfd);if(access("./linux",F_OK)==0){if(unlink("./lunix")==-1){perror("unlink error");return -1;}        }//2绑定struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./linux");//2.2绑定if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind error");return -1;}//3.数据收发char buf[128]="";struct sockaddr_un cun;socklen_t socklen=sizeof(cun);while(1){bzero(buf,sizeof(buf));//read(sfd,buf,sizeof(buf));//读取信息,并将客户端地址信息结构体存储到cin中recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cun,&socklen);printf("读取的消息为:%s\n",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;}}close(sfd);return 0;
}
#include <myhead.h>
int main(int argc, char const *argv[])
{//创建用于通信的套接字文件描述符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;}        }struct sockaddr_un cun;cun.sun_family=AF_UNIX;strcpy(cun.sun_path,"./unix");if(bind(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1){perror("bind error");return -1;}struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./linux");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,0,0);printf("收到消息为:%s\n",buf);}return 0;
}

作业:编写一个客户端,通过TFTP服务器实现文件的上传和下载

#include<myhead.h>
#define SER_PORT 69
#define SER_IP "192.168.122.71"int do_download(int cfd,struct sockaddr_in sin)
{//向服务器发送下载请求char buf[516] = "";//组装请求数据short *p1 = (short *)buf;*p1 = htons(1);char *p2 = buf+2;char filename[20]="";printf("请输入要下载的文件名>>>");scanf("%s",filename);getchar(); strcpy(p2, filename);char *p3 = p2+strlen(p2)+1;strcpy(p3, "octet");int len = 4+strlen(p2) + strlen(p3);   //要发送的长度//向服务器发送请求if((sendto(cfd, buf, len, 0, (struct sockaddr*)&sin, sizeof(sin)))==-1){perror("sendto error");return -1;}printf("下载请求已发送\n");socklen_t addrlen = sizeof(sin);int fd = -1;int res=0;unsigned short b_id = 0;//块编号char ack[4]="";//循环收发 while(1){//客户端收取数据包bzero(buf,sizeof(buf));if((res=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen))==-1){perror("recv error");break;}//printf("收到的前四个字节为:[%d%d%d%d]\n",buf[0],buf[1],buf[2],buf[3]);b_id=ntohs(*(short *)(buf+2));if(buf[1]==3){if((fd=open(filename,O_WRONLY|O_CREAT|O_APPEND,0664))==-1){perror("open error");return -1;}//write(fd,buf+4,res-4);if(write(fd,buf+4,res-4)==-1){perror("write all");break;}//ACK//发送ACK包bzero(ack,sizeof(ack));*(short*)ack=htons(4);*(short *)(ack + 2) = htons(b_id);if((sendto(cfd,ack,4,0,(struct sockaddr*)&sin,sizeof(sin)))==-1){perror("sendto error");break;}if(res <516 ){puts("下载完成");break;}}if(buf[1]==5){puts("error num");//char *err_id=(buf+3);//printf("errid=%d\n",*err_id);break;}}//puts("下载完成");close(fd);return 0;
}int do_upload(int cfd,struct sockaddr_in sin)
{//向服务器发送上传请求char buf[516] = "";//组装请求数据short *p1 = (short *)buf;*p1 = htons(2);char *p2 = buf+2;char filename[20]="";printf("请输入要上传的文件名>>>");scanf("%s",filename);getchar(); strcpy(p2, filename);if(access(filename,F_OK)==-1){perror("文件不存在");return -1;}char *p3 = p2+strlen(p2)+1;strcpy(p3, "octet");int len = 4+strlen(p2) + strlen(p3);   //要发送的长度//向服务器发送请求if((sendto(cfd, buf, len, 0, (struct sockaddr*)&sin, sizeof(sin)))==-1){perror("sendto error");return -1;}printf("上传请求已发送\n");socklen_t addrlen = sizeof(sin);int fd = -1;int res=0;unsigned short b_id = 0;//块编号char ack[4]="";while(1){//客户端收取数据包bzero(ack,sizeof(ack));if((recvfrom(cfd,ack,sizeof(ack),0,(struct sockaddr*)&sin,&addrlen))==-1){perror("recv error");break;}printf("收到的前四个字节为:[%d%d%d%d]\n",ack[0],ack[1],ack[2],ack[3]);b_id=ntohs(*(short *)(ack+2));printf("b_id=%d\n",b_id);if(ack[1]==4){puts("11");fd=open(filename,O_RDONLY);printf("fd=%d\n",fd);if(fd==-1){perror("open error");break;}puts("aa");res=read(fd,buf+4,512);printf("res=%d\n",res);if(res==-1){perror("read error");break;}puts("bb");bzero(buf,sizeof(buf));*(short*)buf=htons(3);*(short *)(buf + 2) = htons(b_id+1);if(sendto(cfd,buf,res+4,0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("sendto error");break;}puts("cc");if(res<512){puts("上传成功");break;}}if(buf[1]==5){puts("error num");char *err_id=(buf+3);printf("errid=%d\n",*err_id);break;}}close(fd);return 0;}int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd == -1){perror("socket error");return -1;}//2、绑定(可选)//3、填充服务器的地址信息结构体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 menu;//制作菜单框架while(1){printf("\t\t====1.download====\n");printf("\t\t====2.upload  ====\n");printf("\t\t====0.exit    ====\n");printf("Please enter function options:");scanf("%c",&menu);while(getchar() != '\n');//对菜单选项多分支选择switch(menu){case '1':    {do_download(cfd,sin);  //下载}break;case '2':{do_upload(cfd,sin);     //上传}break;case '0':exit(1);default:{printf("enter error!!!");}}printf("Enter any key to clear the screen:");while(getchar() != '\n');system("clear");}//5、关闭套接字close(cfd);return 0;
}

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

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

相关文章

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 模块二

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

安泰功率信号源设计方法有哪些

在电子系统中&#xff0c;功率信号源是一个关键的组成部分&#xff0c;用于提供稳定、可靠的电能。这篇文章将详细介绍功率信号源的设计方法&#xff0c;包括选择功率源类型、设计电源拓扑结构、提高效率和管理电磁干扰等方面。 1.功率源类型的选择 选择适当的功率源类型是功率…

【LintCode】892.外星人字典

题目 描述 有一种新的使用拉丁字母的外来语言。但是&#xff0c;你不知道字母之间的顺序。你会从词典中收到一个 非空的 单词列表&#xff0c;其中的单词在这种新语言的规则下按字典顺序排序。请推导出这种语言的字母顺序。 注意&#xff1a; 你可以假设所有的字母都是小写…

MSSQL-识别扩展extended event(扩展事件)中的时间单位

经常使用sqlserver extended event(扩展事件)&#xff0c;但是总是忘记扩展事件使用的时间单位&#xff0c;不确定它们是 秒、毫秒、还是微秒&#xff1f; 以下下代码能够从 相关DMV中提取description字段内容来识别时间单位&#xff1a; SELECT [p].[name] [package_name],[o…

07. 面向对象编程(一)

目录 1、前言 2、类和对象 2.1、定义类 2.2、定义方法 2.3、创建对象 2.4、访问控制 2.4.1、公共变量 2.4.2、私有变量 2.4.3、保护成员 2.4.4、总结 3、封装 4、继承 5、多态 6、小结 1、前言 在Python中&#xff0c;面向对象编程&#xff08;Object-Oriented …

Hoppscotch (PostWoman)调试工具的介绍及详细使用方法

Postwoman是一款强大的API调试工具&#xff0c;可通过用户友好的界面发送和接收HTTP请求&#xff0c;以及测试和调试API端点。 以下是Postwoman的详细使用方法&#xff1a; 直接启动Hoppscotch &#xff1a; 在浏览器中打开Hoppscotch 的官方网站&#xff1a;Hoppscotch • Op…

vuex的初步使用-1

1. 介绍 Vuex 是一个 Vue 的 状态管理工具&#xff0c;状态就是数据。 简单讲&#xff1a;Vuex 就是一个插件&#xff0c;可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。相对于一个仓库&#xff1a;存放组件共享的数据。 2. 安装 vuex 安装vuex与vue-router类似&…

C语言第六十一弹---求最小公倍数

使用C语言求最小公倍数 定义:两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。 方法一:乘积/最大公因数法 已知 最小公倍数 整数乘积 / 最大公因数 思路:使用辗转相除法,获取最大公因数,然后使用整数乘积除以最大公因…

SpringMVC下半篇之拦截器

学习目标 拦截器文件上传异常处理器ssm整合 1.拦截器 1.1.什么是拦截器&#xff1f; ​ Spring MVC中的拦截器&#xff08;Interceptor&#xff09;类似于Servlet中的过滤器&#xff08;Filter&#xff09;&#xff0c;它主要用于拦截用户请求并作相应的处理。例如通过拦截…

基于Mapbox的Mvt矢量瓦片集成实践

目录 前言 一、数据说明 1、基本数据 2、属性数据 二、Mapbox集成Mvt矢量瓦片 1、关于访问令牌 2、定义html 3、初始地图 4、加载矢量瓦片 5、效果展示 总结 前言 熟悉矢量瓦片的朋友一定知道&#xff0c;在Webgis当中&#xff0c;矢量瓦片的格式除了pbf的格式&#x…

前端已死,我们的出路究竟在哪里?

最近前端已死这个话题很火&#xff0c;同时带来的社会效应也很大。在外行看来&#xff0c;以为市场上已经不需要前端了&#xff0c;原本要入行的朋友们也不敢入行了&#xff1b;对于已经入行的朋友们&#xff0c;也会因为这句话增添几分焦虑。 那么前端这个行业的现状到底如何…

UE5 C++的TCP服务器与客户端

客户端.h 需要在Build.cs中加入模块:"Networking","Sockets","Json","JsonUtilities" // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include…

c++八股8

友元函数能不能是虚函数&#xff1a; 友元函数不属于类的成员函数&#xff0c;它独立于类存在&#xff0c;因此不存在是否为虚函数的概念。友元函数主要用于突破类的封装性&#xff0c;使外部函数能访问类的私有和保护成员&#xff0c;它与类的继承和多态无关。TCP三握四挥&…

SQL进阶2

5、检查CHECK约束 CHECK 约束主要用于通过将插入的值限制为遵循定义的值、范围或格式规则的值来强制域完整性。 5.1 CHECK 约束&#xff08;检查性约束&#xff09;用来限制字段的取值范围。 在 CHECK 约束中添加限制条件&#xff0c;只有满足这些条件的值才允许进入该字段。 …

媒体捕捉-iOS中的人脸识别

引言 在如今的移动应用和直播场景中&#xff0c;我们常常能体验到一种颇具趣味与互动性的功能&#xff1a;无论是美颜相机中的萌趣贴纸精准附着于人脸关键点上&#xff0c;还是主播们在直播时实时戴上可爱的虚拟动物耳朵或动态装饰物&#xff0c;这些令人眼前一亮的效果背后&a…

Redis的常用场景有哪些?

1、缓存 缓存现在几乎是所有中大型网站都在用的必杀技&#xff0c;合理的利用缓存不仅能够提升网站访问速度&#xff0c;还能大大降低数据库的压力。Redis提供了键过期功能&#xff0c;也提供了灵活的键淘汰策略&#xff0c;所以&#xff0c;现在Redis用在缓存的场合非常多。 …

算法训练营Day42

#Java #动态规划 # Feeling and experiences&#xff1a; 买卖股票的最佳时机III&#xff1a;力扣题目链接 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意&#x…

docker:环境安装

系列文章目录 docker&#xff1a;环境安装 文章目录 系列文章目录前言一、Debian安装1.镜像下载2.VM安装3.Debian安装 二、docker安装1.Debian12换源2.docker安装3.docker测试4.docker换源 总结 前言 因为CentOS7确定停服时间为6月30日&#xff0c;虽然对我这种小虾米没啥影响…

dubbox框架

1、dubbox介绍 Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个基于Java的高性能RPC&#xff08;Remote Procedure Call&#xff09;框架&#xff0c;使得应用可通过高性能的 RPC 实现服务的输出和输入功能&#xff0c;可以和 Spring框架无缝集成。后期阿里巴巴停止了该项目…

机器学习之样本及统计量

在数理统计中,称研究对象的全体为总体,组成总体的每个基本单元叫个体。从总体X中随机抽取一部分个体 X 1 , X 2 , . . . , X N X_1,X_2,...,X_N X1​,X2​,...,XN​称 X 1 , X 2 , . . . , X N X_1,X_2,...,X_N X1​,X2​,...,XN​为取自X的容量为n的样本。 实际上,数理统计…