嵌入式学习-网络编程-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");//本机IP
    im.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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[ceph] ceph应用

一、资源池 Pool 管理 #创建一个 Pool 资源池&#xff0c;其名字为 mypool&#xff0c;PGs 数量设置为 64&#xff0c;设置 PGs 的同时还需要设置 PGP&#xff08;通常PGs和PGP的值是相同的&#xff09;&#xff1a; PG (Placement Group)&#xff0c;pg 是一个虚拟的概念&…

基于变换域的模版匹配

模板匹配原理 图像的空间域与其他域之间的变换&#xff0c;如傅里叶变换&#xff0c;小波变换&#xff0c;轮廓波变换&#xff0c;剪切波变换等&#xff0c;实际上是图像在其他坐标领域中的表现。在空间域中&#xff0c;图像的信息是像素值和坐标位置&#xff1b;在其他域中&a…

交通流量预测HSTGCNT:Hierarchical Spatio–Temporal Graph Convolutional

Hierarchical Spatio–Temporal Graph Convolutional Networks and Transformer Network for Traffic Flow Forecasting 交通流预测的层次时空图卷积网络和Transformer网络 Abstract 图卷积网络&#xff08;GCN&#xff09;具有图形化描述道路网络不规则拓扑结构的能力&#…

【C语言】数据结构——排序三(归并与计数排序)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a;1. 归并排序1.1 基本思想1.2 递归实现1.3 非递归实现 2. 计数排序2.1 基本思想2.2 代码实现 导读&#x…

如何用Python进行数据分析(保姆级教程)

有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了&#xff0c;比较复杂。 很多网上的资料都是从语法教起的&#xff0c;花了很多时间还是云里雾里&#xff0c;摸不清方向。今天就给大家来捋一捋思路&#xff01;帮助大家提高学习效率&#xff01; Pyt…

夜神安装Magisk及Delta(狐狸面具)教程

Magisk和LSPosed、EdXPosed下载 Magisk框架下载与安装教程 - 多开鸭Magisk及LSPosed在模拟器安装的详细视频教程 推荐先看一遍教程 视频教程 雷电模拟器版本教程&#xff1a;https://www.bilibili.com/video/BV1kv4y127af 夜神模拟https://www.duokaiya.com/magisk.html 夜神模…

JS遍历对象的方法及特点

1、定义一个对象 let obj {name: Tom,age: 20,sex: 男,};obj.weight 70kg;// obj的原型上定义属性Object.prototype.height 180cm;Object.prototype.major function() {console.log(专业&#xff1a;计算机应用技术);};console.log(obj, obj); 控制台输出的obj中&#xff…

C++make_pair,你真的懂了吗?

其实写这篇文章我还是很忐忑的&#xff0c;因为用C也写了快一年了&#xff0c;平时代码量个人认为还可以&#xff0c;但是最近两天频繁犯错&#xff0c;下面先说说我写的错误吧&#xff01; 我们都知道make_pair返回的是一个pair类型的函数&#xff0c;而pair这个键值对它又是…

go语言(一)----声明常量

package mainimport ("fmt""time" )func main() {fmt.Print("hello go!")time.Sleep(1 * time.Second)}运行后&#xff0c;结果如下&#xff1a; 1、golang表达式中&#xff0c;加&#xff1b;和不加&#xff1b;都可以 2、函数的{和函数名一…

二二复制模式玩法解析

这个模式和小编介绍的其他模式不同&#xff0c;其他的模式都是需要一个推荐来获得返利或者免单的&#xff0c;但是这个模式是不需要的&#xff0c;因为它可以依靠平台来完成闭环。 具体是怎么操作的呢&#xff1f;这个模式很简单&#xff0c;只有两个奖励。一个是直推奖&#x…

C++初阶类与对象(一):学习类与对象、访问限定符、封装、this指针

入门知识已经梳理完毕了&#xff0c;接下来就进入到面型对象的部分学习了 文章目录 1.面向过程和面向对象初步认识2.类的引入3.类的定义3.1类的结构3.2类的两种定义方式3.2.1声明和定义全部放在类体中3.2.2声明和定义分开 3.3成员变量命名规则的建议 4.类的访问限定符及封装4.1…

Java-NIO篇章(2)——Buffer缓冲区详解

Buffer类简介 Buffer类是一个抽象类&#xff0c;对应于Java的主要数据类型&#xff0c;在NIO中有8种缓冲区类&#xff0c;分别如下&#xff1a; ByteBuffer、 CharBuffer、 DoubleBuffer、 FloatBuffer、 IntBuffer、 LongBuffer、 ShortBuffer、MappedByteBuffer。 本文以它的…

【Linux】nc 网络诊断 | 文件传输 命令详解

目录 一、命令简介 二、命令使用 2.1 测试服务器 2.2 端口连通性测试 2.2.1tcp端口连通性测试 2.2.2udp端口连通性测试 2.3 文件及目录的传输 2.3.1 文件传输(TCP端口) 2.3.2 文件传输(UDP端口) 相关文章&#xff1a; 【网络】抓包工具Wireshark下载安装和基本使用教…

EasyConnect客户端 连接时提示,获取服务端配置信息失败

环境&#xff1a; EasyConnect客户端 问题描述&#xff1a; EasyConnect客户端 连接时提示&#xff0c;获取服务端配置信息失败 解决方案&#xff1a; 1.电脑上的防火墙和杀毒软件建议关闭,右键以管理员身份运行EasyConnect客户端使用(临时解决本案例) 2.用修复工具修复测…

maxwell同步全量历史数据

CentOS安装maxwell 在上篇的基础上&#xff0c;我们实现了实时同步mysql数据到kafka。maxwell不仅可以同步实时数据&#xff0c;也可以同步全量历史数据。在这里模拟一下历史数据的场景&#xff0c;创建表结构如下&#xff0c;并写入测试数据。 CREATE TABLE user_det…

手把手教你搭建3D元宇宙场景!

AMRT3D引擎一经上线&#xff0c;便立即引起了3D爱好者们的热烈反响。许多用户纷纷下载了此引擎&#xff0c;并开始认真学习和使用它。 有的用户甚至只用了一天的时间&#xff0c;就已经可以利用AMRT3D引擎搭建出一个3D项目。这充分说明了AMRT3D引擎的强大和高效&#xff0c;也…

代码随想录算法训练营第31天 | 理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和

目录 理论基础 455.分发饼干 &#x1f4a1;解题思路 &#x1f4bb;实现代码 376. 摆动序列 &#x1f4a1;解题思路 # 情况一&#xff1a;上下坡中有平坡 # 情况二&#xff1a;数组首尾两端 情况三&#xff1a;单调坡度有平坡 &#x1f4bb;实现代码 53. 最大子序…

matlab快速入门(读取数据并绘制散点图和拉格朗日插值

目录 1.读取excel&#xff1a;2.注释快捷键&#xff1a;3.数组/矩阵索引&#xff1a;4.绘制散点图&#xff1a;5.拉格朗日插值&#xff1a;5.1分割出非空和空的x和y两组数据&#xff1a;5.2插值&#xff1a;5.3画图&#xff1a; 小结&#xff1a; 1.读取excel&#xff1a; [nu…

抖店商家怎么维护好与达人关系?2024新版维护达人思路方法

我是王路飞。 当你找到达人给你带货&#xff0c;且积累了一些达人资源之后&#xff0c;就需要维护好与达人的关系了。 毕竟找达人带货玩法的好处&#xff0c;就是长期稳定&#xff0c;他能给你带来持续的收益。 那么抖店商家应该如何维护好与达人的关系呢&#xff1f; 这篇…

第4章 通信系统

文章目录 4.1.1 基本概念4.1.2 通信系统的组成1、通信系统的一般模型2、模拟通信系统3、数字通信系统 4.1.3 通信系统分类与通信方式1、通信系统分类2、通信方式 4.1.4 通信系统的性能指标&#xff08;质量指标&#xff09;4.2 信源编码4.2.1 信源的概念与特性4.2.2 信源编码概…