【Linux网络编程必学!】——Linux_网络编程_UDP_arduino udpclient(2)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以点击这里获取!

结构图

在这里插入图片描述

struct sockaddr {  
    unsigned short    sa_family;    // 2 bytes address family, AF\_xxx unsiged short
    char              sa_data[14];     // 14 bytes of protocol address 
}; 

struct sockaddr\_in {  
    short            sin_family;       // 2 bytes e.g. AF\_INET, AF\_INET6 
    unsigned short   sin_port;    // 2 bytes e.g. htons(3490) 
    struct in\_addr   sin_addr;     // 4 bytes see struct in\_addr, below 
    char             sin_zero[8];     // 8 bytes zero this if you want to 
};  

  
struct in\_addr {  
    unsigned long s_addr;          // 4 bytes load with inet\_pton() 
}; 

用例
在这里插入图片描述

4. 认识UDP协议

  • Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法
  • Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情
  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报(SOCK_DGRAM)
  • UDP的框架图
    在这里插入图片描述

5. socket编程接口

  1. 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
#include <sys/types.h> 
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

用例
在这里插入图片描述

  • domain:用于设置网络通信的域,socket根据这个参数选择信息协议的族(一般选择如下两个,但不止如此两个)
  1. AF_INET IPv4 Internet protocols //用于IPV4
  2. AF_INET6 IPv6 Internet protocols //用于IPV6
  • type:(只列出最重要的三个):
  1. SOCK_STREAM Provides sequenced, reliable, two-way, connection-based byte streams. //用于TCP
  2. SOCK_DGRAM Supports datagrams (connectionless, unreliable messages ). //用于UDP
  3. SOCK_RAW Provides raw network protocol access. //RAW类型,用于提供原始网络访问
  • protocol:置0即可
  • 返回值
    成功:非负的文件描述符
    失败:-1
  1. 绑定端口号 (TCP/UDP, 服务器)
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr\* my_addr, socklen_t addrlen);

用例
在这里插入图片描述

  • sockfd:正在监听端口的套接口文件描述符,通过socket获得
  • my_addr:需要绑定的IP和端口
  • addrlen:my_addr的结构体的大小
  • 返回值
    成功:0
    失败:-1
  1. 发送 (TCP/UDP, 服务器)
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void \*buf, size_t len, int flags,
              const struct sockaddr \*dest_addr, socklen_t addrlen);

用例
在这里插入图片描述

  • sockfd:正在监听端口的套接口文件描述符,通过socket获得
  • buf:发送缓冲区,往往是使用者定义的数组,该数组装有要发送的数据
  • len:发送缓冲区的大小,单位是字节
  • flags:填0即可
  • dest_addr:指向接收数据的主机地址信息的结构体,也就是该参数指定数据要发送到哪个主机哪个进程
  • addrlen:表示第五个参数所指向内容的长度
  • 返回值
    成功:返回发送成功的数据长度
    失败: -1
  1. 接收(TCP/UDP, 服务器)
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void \*buf, size_t len, int flags,
                struct sockaddr \*src_addr, socklen_t \*addrlen);

用例
在这里插入图片描述

  • sockfd:正在监听端口的套接口文件描述符,通过socket获得
  • buf:接收缓冲区,往往是使用者定义的数组,该数组装有接收到的数据
  • len:接收缓冲区的大小,单位是字节
  • flags:填0即可
  • src_addr:指向发送数据的主机地址信息的结构体,也就是我们可以从该参数获取到数据是谁发出的
  • addrlen:表示第五个参数所指向内容的长度
  • 返回值
    成功:返回接收成功的数据长度
    失败: -1

6. 代码实现UDP

  • udpClient.cpp
#include"udpClient.hpp"

void Usage(std::string proc)
{
  std::cout<<"Usage: "<<proc<<" svr\_ip svr\_port"<<std::endl;
}
int main(int argc,char \*argv[])
{
  if(argc != 3)
  {
    Usage(argv[0]);
    exit(1);

  }
  udpClient uc(argv[1],atoi(argv[2]));
  uc.initClient();
  uc.start();

  return 0;
}


  • udpClient.hpp
#pragma once 

#include<iostream>
#include<string>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<cstdlib>

class udpClient
{
  public:
    //Server ip , port;
    udpClient(std::string _ip="127.0.0.1",int _port=8080)
      :ip(_ip)
      ,port(_port)
  {}
    void initClient()
    {
      sock = socket(AF_INET,SOCK_DGRAM,0);
      std::cout<<"sock"<<sock<<std::endl;
    // struct sockaddr\_in local;
    // local.sin\_family = AF\_INET;
    // local.sin\_port = htons(port);
    // local.sin\_addr.s\_addr = inet\_addr(ip.c\_str());
    //
    //
    // if(bind(sock,(struct sockaddr\*)&local,sizeof(local)) < 0)
    // {
    // std::cerr<<"bind error!\n"<<std::endl;
    // exit(1);
    // }
    }

    void start()
    {
     // char msg[64];
      std::string msg;
      struct sockaddr\_in peer;
      peer.sin_family = AF_INET;
      peer.sin_port = htons(port);
      peer.sin_addr.s_addr = inet\_addr(ip.c\_str());
      while(1)
      {
        std::cout<<"Please Enter: ";
        std::cin>>msg;
        if(msg == "quit")
        {
          break;
        }
        sendto(sock,msg.c\_str(),msg.size(),0,(struct sockaddr\*)&peer,sizeof(peer));

        char echo[128];
        ssize_t s=recvfrom(sock,echo,sizeof(echo)-1,0,nullptr,nullptr);
        echo[s]='\0';
        if(s>0)
        {
          std::cout<<" server: "<<echo<<std::endl;
        }
       // msg[0]='\0';
       // struct sockaddr\_in end\_point;
       // socklen\_t len = sizeof(end\_point);
       // ssize\_t s=recvfrom(sock,msg,sizeof(msg)-1,0,(struct sockaddr\*)&end\_point,&len);
       // if(s>0)
       // {
       // msg[s]='\0';
       // std::cout<<"Client :" << msg <<std::endl;
       // std::string echo\_string = msg;
       // echo\_string += " [server echo!]";
       // sendto(sock,echo\_string.c\_str(),echo\_string.size(),0,(struct sockaddr\*)&end\_point,len);
       // }
      }
    }
    ~udpClient()
    {
      close(sock);
    }
  private:
    std::string ip;
    int port;
    int sock;
};


  • udpServer.cpp
#include"udpServer.hpp"
void Usage(std::string proc)
{
  std::cout<<"Usage: "<< proc <<"local\_ip local\_proc"<<std::endl;
}
int main(int argc,char \*argv[])
{
  if(argc != 2)
  {
    Usage(argv[0]);
      exit(1);
  }
  udpServer \*up = new udpServer(atoi(argv[1]));
  up->initServer();
  up->start();

  delete up;
}


  • udpServer.hpp
#pragma once 

#include<iostream>
#include<string>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<cstdlib>
#include<cstdio>
#include<map>

class udpServer
{
  public:
    udpServer(int _port=8080)
     // :ip(\_ip)
      :port(_port)
    {


**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里**

**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/1ec0e90d4ddb33d1941b8ed8b94570dc.png)
![img](https://img-blog.csdnimg.cn/img_convert/69ed9e8024294fe6ff1e47d2c35fecbf.png)
![img](https://img-blog.csdnimg.cn/img_convert/5f4e557c393102f7b232c99a9abadf33.png)
![img](https://img-blog.csdnimg.cn/img_convert/5d7fdb649e3ba247ed92102a9c817fb7.png)
![img](https://img-blog.csdnimg.cn/img_convert/ee90c233d9e6bee4f76833990ddd7723.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**

50)]
[外链图片转存中...(img-vBa8mRwc-1715003427850)]
[外链图片转存中...(img-6QhTHoGN-1715003427851)]
[外链图片转存中...(img-hFsfW4Fy-1715003427851)]
[外链图片转存中...(img-HcF3Qg69-1715003427851)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**

  • 19
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是Arduino蓝牙编程教程及示例: 1.准备工作 首先,你需要准备以下材料: - 一个Arduino板 - 一个蓝牙模块(如HC-05或HC-06) - 杜邦线若干 接下来,将蓝牙模块连接到Arduino,连接方式如下: - 将蓝牙模块的TXD引脚连接到Arduino的RX引脚 - 将蓝牙模块的RXD引脚连接到Arduino的TX引脚 - 将蓝牙模块的GND引脚连接到Arduino的GND引脚 - 将蓝牙模块的VCC引脚连接到Arduino的5V引脚 2.编程 接下来,我们来编写程序。在Arduino IDE中,点击File -> Examples -> SoftwareSerial -> SoftwareSerialExample,将代码复制到编辑器中,然后进行以下更改: - 将RX引脚设置为2,将TX引脚设置为3(这是默认值) - 将波特率设置为蓝牙模块的波特率(如HC-05默认为9600) 然后,编写以下代码: #include <SoftwareSerial.h> SoftwareSerial bluetooth(2, 3); // RX, TX void setup() { Serial.begin(9600); bluetooth.begin(9600); } void loop() { if (bluetooth.available()) { Serial.write(bluetooth.read()); } if (Serial.available()) { bluetooth.write(Serial.read()); } } 这段代码的作用是将串口输出转发到蓝牙模块,将蓝牙模块的输入转发到串口输出。这样,当你在串口输入一些内容时,它们将被发送到蓝牙模块,从而可以与其他设备进行通信。 3.测试 现在,上传代码到Arduino板,并打开串口监视器。在串口监视器中输入一些内容,然后按发送按钮。你应该可以在其他设备上看到相同的内容。同样,当其他设备向蓝牙模块发送内容时,你也应该在串口监视器中看到相同的内容。 这就是使用Arduino和蓝牙模块进行通信的基本示例。你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值