Rtthread OS 功能开发之 socket udp协议程序开发

在使用ART-PI 硬件开启WiFi联网之后,就可以进行TCP和UDP协议编程了。ART-PI WIFI联网方法

在Settings 中查看网络选项中是否选中了以下的三层。

随后再查看以下选择项是否正常启动。一般来说这些是默认打开的。

确保以上项都已经选择后。新建一个文件:

程序如下:

cpp 复制代码
/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2026-10-12     yinchenxi       the first version
 */
#include <rtthread.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <sys/time.h>

rt_thread_t rth_udp_send;
rt_thread_t rth_upd_recv;
#define SERVERIP "172.20.10.2"
#define SERVER_PORT 8888


typedef struct{
    int sock;
    struct sockaddr_in server_addr;
}UDP_Sock;


int sendcnt = 0;
static void udp_client_recv_entry(void* parmater)
{
    UDP_Sock *udpsock = (UDP_Sock*)parmater;
    char recv_buf[128];
    int recv_len;
    struct timeval tv_out;
    struct sockaddr_in server_addr, client_addr;
    socklen_t addr_len = sizeof(client_addr);

    tv_out.tv_sec = 3;
    tv_out.tv_usec = 0;
    setsockopt(udpsock->sock, SOL_SOCKET, SO_RCVTIMEO, &tv_out, sizeof(tv_out));

    while(1)
    {
        recv_len = recvfrom(udpsock->sock, recv_buf,sizeof(recv_buf)-1, 0,
                (struct sockaddr *)&client_addr, &addr_len);

        if(recv_len > 0)
        {
            recv_buf[recv_len] = '\0';
            rt_kprintf("Received from server: %s\n", recv_buf);
        }
        rt_thread_mdelay(100);
    }


}
static void udp_client_send_entry(void *paramter)
{

    UDP_Sock *udpsock = (UDP_Sock*)paramter;


    char send_buf[128] ;
    int send_len;


    while(1)
    {
        sendcnt ++;
        rt_snprintf(send_buf,sizeof(send_buf),"Hello From ART-Pi Client%d",sendcnt);

        send_len  = sendto(udpsock->sock, send_buf, strlen(send_buf), 0,
                (struct sockaddr*)&udpsock->server_addr, sizeof(udpsock->server_addr));

        if(send_len > 0)
        {
            rt_kprintf("UDP send successful %d bytes send \n",send_len);
        }
        else {
            rt_kprintf("UDP send failed\n");
        }

        rt_thread_mdelay(1500);
    }
    closesocket(udpsock->sock);

}


static UDP_Sock udpsock;  // 改为静态变量,生命周期贯穿整个程序

void rth_udp_create(void)
{
    rt_memset(&udpsock, 0, sizeof(udpsock));
    udpsock.sock = socket(AF_INET, SOCK_DGRAM , 0 );
    if(udpsock.sock < 0)
    {
       rt_kprintf("Socket creation failed\n");
       return ;
    }

    udpsock.server_addr.sin_family = AF_INET;
    udpsock.server_addr.sin_port   = htons(SERVER_PORT);
    udpsock.server_addr.sin_addr.s_addr = inet_addr(SERVERIP);

    rth_udp_send = rt_thread_create("udp_send", udp_client_send_entry, &udpsock, 2048, 5, 100);
    rth_upd_recv = rt_thread_create("udp_recv", udp_client_recv_entry, &udpsock, 2048, 6, 100);

    rt_thread_startup(rth_upd_recv);
    rt_thread_startup(rth_udp_send);
}

MSH_CMD_EXPORT(rth_udp_create,"udp test");

本实例使用的是UDP客户端,创建了两个线程,一个发送数据另一个接收数据。

#define SERVERIP "172.20.10.2"

代表服务器的IP地址,局域网测试,需要客户端和服务器连接同一个WiFi,并且客户端需要指定服务器的IP地址才可以正常通信。

测试结果如下:

客户端打包数据发给服务器之后,服务器又将数据传回客户端,一个非常简单的数据回环测试。

相关推荐
饿了吃洗衣凝珠1 小时前
red hot day1
网络
牧羊人.3331 小时前
自然语言处理基础 04|长短期记忆网络 LSTM
网络·人工智能·rnn·深度学习·学习·自然语言处理·lstm
lambo mercy2 小时前
Day4:流式传输
运维·服务器·网络
ESDWAN2 小时前
跨境网络延迟、抖动和丢包有什么区别?如何判断业务影响
开发语言·网络·计算机网络·php
比兔代理2 小时前
HTTP 代理与 TLS 指纹:如何避免被识别为代理流量?
网络·网络协议·http
上海云盾-小余2 小时前
自定义端口 HTTPS 部署:高防接入遇到的问题与调优方案
网络协议·http·https
枫叶丹42 小时前
异构数据库结构如何同步:理解 KFS 的 DDL 转换机制
网络·数据库
Zw-awa2 小时前
先把轮子转稳,才不会烧心:编码器速度环 PID 怎么接回 PWM
stm32
wespaul2 小时前
VeapAI 自然语言操作实战|第 08 篇:治理层——审计、指标、评估与权限
运维·网络·数据库