rt-thread-official/examples/network/udpclient.c

183 lines
4.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-01-24 ChungHsuan improve code comments
*/
#include <rtthread.h>
#include <sys/socket.h> /* socket.h header file is needed when using BSD socket */ /* 使用BSD socket需要包含sockets.h头文件 */
#include "netdb.h"
#define DEBUG_UDP_CLIENT
#define DBG_TAG "UDP"
#ifdef DEBUG_UDP_CLIENT
#define DBG_LVL DBG_LOG
#else
#define DBG_LVL DBG_INFO /* DBG_ERROR */
#endif
#include <rtdbg.h>
static int started = 0;
static int is_running = 0;
static char url[256];
static int port = 8080;
static int count = 10;
const char send_data[] = "This is UDP Client from RT-Thread.\n";/* The message be sent */ /* 发送用到的数据 */
/**
* @brief This function is for creating a udp client on RT-Thread
*/
static void udpclient(void *arg)
{
int sock;
struct hostent *host;
struct sockaddr_in server_addr;
/* Get host address by parameter URL (domain name resolution if input domain) */
/* 通过函数入口参数url获得host地址如果是域名会做域名解析 */
host = (struct hostent *) gethostbyname(url);
if (host == RT_NULL)
{
LOG_E("Get host by name failed!");
return;
}
/* Create a socket and set it to SOCK_DGRAM(UDP) */
/* 创建一个socket类型是SOCK_DGRAMUDP类型 */
if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
{
/* Failed on creatinf socket */
LOG_E("Create socket error");
return;
}
/* Initialize server side address */
/* 初始化预连接的服务端地址 */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
started = 1;
is_running = 1;
/* The total sending number(count) */
/* 总计发送count次数据 */
while (count && is_running)
{
/* Send message to server side */
/* 发送数据到服务远端 */
sendto(sock, send_data, rt_strlen(send_data), 0,
(struct sockaddr *)&server_addr, sizeof(struct sockaddr));
/* Thread sllep for 1 second */
/* 线程休眠一段时间 */
rt_thread_mdelay(1000);
/* count decrease 1 */
/* 计数值减一 */
count --;
}
if (count == 0)
{
LOG_I("UDP client send data finished!");
}
/* Close the socket */
/* 关闭这个socket */
if (sock >= 0)
{
closesocket(sock);
sock = -1;
}
started = 0;
is_running = 0;
}
/**
* @brief The usage description of udp client on rt-Thread
*/
static void usage(void)
{
rt_kprintf("Usage: udpclient -h <host> -p <port> [--cnt] [count]\n");
rt_kprintf(" udpclient --stop\n");
rt_kprintf(" udpclient --help\n");
rt_kprintf("\n");
rt_kprintf("Miscellaneous:\n");
rt_kprintf(" -h Specify host address\n");
rt_kprintf(" -p Specify the host port number\n");
rt_kprintf(" --cnt Specify the send data count\n");
rt_kprintf(" --stop Stop udpclient program\n");
rt_kprintf(" --help Print help information\n");
}
/**
* @brief This function is for testing udp client on rt-Thread
*/
static void udpclient_test(int argc, char** argv)
{
rt_thread_t tid;
if (argc == 1 || argc > 7)
{
LOG_I("Please check the command you entered!\n");
goto __usage;
}
else
{
if (rt_strcmp(argv[1], "--help") == 0)
{
goto __usage;
}
else if (rt_strcmp(argv[1], "--stop") == 0)
{
is_running = 0;
return;
}
else if (rt_strcmp(argv[1], "-h") == 0 && rt_strcmp(argv[3], "-p") == 0)
{
if (started)
{
LOG_I("The udpclient has started!");
LOG_I("Please stop udpclient firstly, by: udpclient --stop");
return;
}
if (argc == 7 && rt_strcmp(argv[6], "--cnt") == 0)
{
count = atoi(argv[7]);
}
if (rt_strlen(argv[2]) > sizeof(url))
{
LOG_E("The input url is too long, max %d bytes!", sizeof(url));
return;
}
rt_memset(url, 0x0, sizeof(url));
rt_strncpy(url, argv[2], rt_strlen(argv[2]));
port = atoi(argv[4]);
}
else
{
goto __usage;
}
}
tid = rt_thread_create("udp_client",
udpclient, RT_NULL,
2048, RT_THREAD_PRIORITY_MAX/3, 20);
if (tid != RT_NULL)
{
rt_thread_startup(tid);
}
return;
__usage:
usage();
}
#ifdef RT_USING_FINSH
MSH_CMD_EXPORT_ALIAS(udpclient_test, udpclient,
Start a udp client. Help: udpclient --help);
#endif