zoukankan      html  css  js  c++  java
  • rt-thread udp tcp 代码转载

    最近发现不止一个人再要基于 RT-Thread 的 TCP 和 UDP 示例代码,包括 SAL 方式的。

    这里给出一个我自己写的示例程序吧,希望可以帮到需要的人。

    代码一键下载地址,点我

    /*
    * Copyright (c) 2006-2019, RT-Thread Development Team
    *
    * SPDX-License-Identifier: Apache-2.0
    *
    * Change Logs:
    * Date Author Notes
    * 2019-07-09 MurphyZhao first version
    */

    #include <stdio.h>
    #include <string.h>
    #include <stdint.h>
    #include <stdlib.h>

    #include <rtthread.h>

    #ifdef RT_USING_SAL

    #include <sys/socket.h>
    #include <netdb.h>
    #include "sal_tls.h"
    #include "sys/time.h"
    #else

    #include "lwip/sockets.h"
    #include "lwip/netdb.h"
    #include "lwip/sys.h"
    #include "lwip/inet.h"

    #endif /* RT_USING_SAL */

    #define LOG_TAG "demo.tcp"
    #define LOG_LVL LOG_LVL_DBG
    #include <ulog.h>

    #define TCP_TEST_HOST "www.rt-thread.com"
    #define TCP_TEST_PORT (80u)

    #define TEST_BUFSZ (1024u)

    static const char *req_data = "GET /service/rt-thread.txt HTTP/1.1 "
    "Host: www.rt-thread.com "
    "User-Agent: rtthread/4.0.1 rtt ";

    static char req_uri[128];
    static int req_port;

    static void nb_tcp_demo(int argc, char** argv)
    {
    int ret;

    int sock = -1;
    struct hostent *host;
    struct sockaddr_in server_addr;
    int bytes_received;
    char *recv_data;

    char ip_addr_buf[64];

    if ((argc != 1) && (argc != 3))
    {
    LOG_E("In param error");
    LOG_I("cmd: demo_tcp [<host> <port>]");
    LOG_I("eg: demo_tcp");
    LOG_I(" demo_tcp 127.0.0.1 8080");
    return;
    }

    rt_memset(req_uri, 0x0, sizeof(req_uri));

    if (argc == 3)
    {
    rt_strncpy(req_uri, argv[1], rt_strlen(argv[1]));
    req_port = atoi(argv[2]);
    }
    else
    {
    rt_strncpy(req_uri, TCP_TEST_HOST, rt_strlen(TCP_TEST_HOST));
    req_port = TCP_TEST_PORT;
    }

    LOG_I("TCP demo start");

    LOG_I("Host:%s; Port:%d", req_uri, req_port);

    LOG_D("will gethostbyname...");
    host = gethostbyname(req_uri);
    if (!host)
    {
    LOG_E("gethostbyname failed!");
    return;
    }

    LOG_I("gethostbyname pass. ip addr: %s", inet_ntoa_r(*((struct in_addr *)host->h_addr_list[0]), ip_addr_buf, sizeof(ip_addr_buf)));

    recv_data = rt_calloc(1, TEST_BUFSZ);
    if (recv_data == RT_NULL)
    {
    LOG_E("calloc failed. No memory!");
    return;
    }

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
    LOG_E("Create socket failed!");
    goto __exit;
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(req_port);
    server_addr.sin_addr = *((struct in_addr *)host->h_addr);
    rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));

    if ((ret = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))) < 0)
    {
    LOG_E("Connect <%d> fail! ret:%d", sock, ret);
    goto __exit;
    }
    LOG_I("connect <%s> success", ip_addr_buf);

    ret = send(sock, req_data, strlen(req_data), 0);
    if (ret <= 0)
    {
    LOG_E("send error, will close the socket <%d>.", sock);
    goto __exit;
    }
    LOG_I("send success");

    bytes_received = recv(sock, recv_data, TEST_BUFSZ - 1, 0);
    if (bytes_received <= 0)
    {
    LOG_E("receive error, will close the socket <%d>.", sock);
    goto __exit;
    }

    LOG_I("received data: ");
    for (int i = 0; i < bytes_received; i++)
    {
    rt_kprintf("%c", recv_data[i]);
    }
    rt_kprintf(" ");

    __exit:
    if (recv_data)
    rt_free(recv_data);

    if (sock >= 0)
    {
    closesocket(sock);
    sock = -1;
    }

    LOG_I("TCP demo end");
    }
    #ifdef FINSH_USING_MSH
    #include <finsh.h>
    MSH_CMD_EXPORT_ALIAS(nb_tcp_demo, demo_tcp, nbiot tcp test);
    #endif /* FINSH_USING_MSH */

    //udp

    /*
    * Copyright (c) 2006-2019, RT-Thread Development Team
    *
    * SPDX-License-Identifier: Apache-2.0
    *
    * Change Logs:
    * Date Author Notes
    * 2019-07-09 MurphyZhao first version
    */

    #include <stdio.h>
    #include <string.h>
    #include <stdint.h>
    #include <stdlib.h>

    #include <rtthread.h>

    #ifdef RT_USING_SAL

    #include <sys/socket.h>
    #include <netdb.h>
    #include "sal_tls.h"
    #include "sys/time.h"
    #else

    #include "lwip/sockets.h"
    #include "lwip/netdb.h"
    #include "lwip/sys.h"
    #include "lwip/inet.h"

    #endif /* RT_USING_SAL */

    #define LOG_TAG "demo.udp"
    #define LOG_LVL LOG_LVL_DBG
    #include <ulog.h>

    #define TCP_TEST_HOST "114.116.144.151"
    #define TCP_TEST_PORT (2010u)

    #define TEST_BUFSZ (1024u)

    static const char *req_data = "This message is from NB-IOT UDP Client with RT-Thread. ";
    static char req_uri[128];
    static int req_port;

    static void nb_udp_demo(int argc, char** argv)
    {
    int ret;

    int sock = -1;
    struct hostent *host;
    struct sockaddr_in server_addr;
    char *recv_data;
    int bytes_received;

    char ip_addr_buf[64];

    LOG_I("UDP demo start");

    if ((argc != 1) && (argc != 3))
    {
    LOG_E("In param error");
    LOG_I("cmd: demo_udp [<host> <port>]");
    LOG_I("eg: demo_udp");
    LOG_I(" demo_udp 127.0.0.1 8080");
    return;
    }

    rt_memset(req_uri, 0x0, sizeof(req_uri));

    if (argc == 3)
    {
    rt_strncpy(req_uri, argv[1], rt_strlen(argv[1]));
    req_port = atoi(argv[2]);
    }
    else
    {
    rt_strncpy(req_uri, TCP_TEST_HOST, rt_strlen(TCP_TEST_HOST));
    req_port = TCP_TEST_PORT;
    }

    LOG_I("Host:%s; Port:%d", req_uri, req_port);

    LOG_D("will gethostbyname...");
    host = gethostbyname(req_uri);
    if (!host)
    {
    LOG_E("gethostbyname failed!");
    return;
    }

    LOG_I("gethostbyname pass. ip addr: %s", inet_ntoa_r(*((struct in_addr *)host->h_addr_list[0]), ip_addr_buf, sizeof(ip_addr_buf)));

    recv_data = rt_calloc(1, TEST_BUFSZ);
    if (recv_data == RT_NULL)
    {
    LOG_E("calloc failed. No memory!");
    return;
    }

    if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
    {
    LOG_E("Create socket failed!");
    goto __exit;
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(req_port);
    server_addr.sin_addr = *((struct in_addr *)host->h_addr);
    rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));

    if ((ret = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))) < 0)
    {
    LOG_E("Connect <%d> fail! ret:%d", sock, ret);
    goto __exit;
    }
    LOG_I("connect <%s> success", ip_addr_buf);

    ret = send(sock, req_data, strlen(req_data), 0);
    if (ret <= 0)
    {
    LOG_E("send error, will close the socket <%d>.", sock);
    goto __exit;
    }
    LOG_I("send success");

    bytes_received = recv(sock, recv_data, TEST_BUFSZ - 1, 0);
    if (bytes_received <= 0)
    {
    LOG_E("receive error, will close the socket <%d>.", sock);
    goto __exit;
    }

    LOG_I("received data: ");
    for (int i = 0; i < bytes_received; i++)
    {
    rt_kprintf("%c", recv_data[i]);
    }
    rt_kprintf(" ");

    __exit:
    if (recv_data)
    rt_free(recv_data);

    if (sock >= 0)
    {
    closesocket(sock);
    sock = -1;
    }

    LOG_I("UDP demo end");
    }
    #ifdef FINSH_USING_MSH
    #include <finsh.h>
    MSH_CMD_EXPORT_ALIAS(nb_udp_demo, demo_udp, nbiot udp test);
    #endif /* FINSH_USING_MSH */

  • 相关阅读:
    OCP 062【中文】考试题库(cuug内部资料)第29题
    413. 等差数列划分 力扣(中等) 找规律,细节
    264. 丑数 II 力扣(中等) 动态规划,不会
    313. 超级丑数 力扣(中等) 动态规划,不会做
    5840. 使字符串平衡的最小交换次数 力扣(中等) 第255场oppo周赛 猜出来的
    手写一个仿微信登录的Nodejs程序
    你不知道的CSS国际化
    React实现类似淘宝tab居中切换效果
    原来 CSS 这样写是会让 App 崩溃的
    css中class和id之间有什么区别?
  • 原文地址:https://www.cnblogs.com/eastgeneral/p/12221830.html
Copyright © 2011-2022 走看看