2025-06-27 00:32:57 +08:00
# include <rtthread.h>
2025-07-05 19:47:28 +08:00
# include <sys/socket.h> /* ʹ <> <CAB9> BSD socket<65> <74> <EFBFBD> <EFBFBD> Ҫ<EFBFBD> <D2AA> <EFBFBD> <EFBFBD> sockets.hͷ<68> ļ<EFBFBD> */
2025-06-27 00:32:57 +08:00
# include "netdb.h"
# define DEBUG_UDP_CLIENT
# define DBG_ENABLE
# define DBG_SECTION_NAME "UDP"
# ifdef DEBUG_UDP_CLIENT
# define DBG_LEVEL DBG_LOG
# else
# define DBG_LEVEL DBG_INFO /* DBG_ERROR */
# endif
# define DBG_COLOR
# include <rtdbg.h>
static int started = 0 ;
static int is_running = 0 ;
static char url [ 256 ] ;
static int port = 8080 ;
static int count = 10 ;
2025-07-05 19:47:28 +08:00
const char send_data [ ] = " This is UDP Client from RT-Thread. \n " ; /* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> õ<EFBFBD> <C3B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
2025-06-27 00:32:57 +08:00
static void udpclient ( void * arg )
{
int sock ;
struct hostent * host ;
struct sockaddr_in server_addr ;
2025-07-05 19:47:28 +08:00
/* ͨ<> <CDA8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڲ<EFBFBD> <DAB2> <EFBFBD> url<72> <6C> <EFBFBD> <EFBFBD> host<73> <74> ַ<EFBFBD> <D6B7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
2025-06-27 00:32:57 +08:00
host = ( struct hostent * ) gethostbyname ( url ) ;
if ( host = = RT_NULL )
{
LOG_E ( " Get host by name failed! " ) ;
return ;
}
2025-07-05 19:47:28 +08:00
/* <20> <> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB> socket<65> <74> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> SOCK_DGRAM<41> <4D> UDP<44> <50> <EFBFBD> <EFBFBD> */
2025-06-27 00:32:57 +08:00
if ( ( sock = socket ( AF_INET , SOCK_DGRAM , IPPROTO_UDP ) ) = = - 1 )
{
LOG_E ( " Create socket error " ) ;
return ;
}
2025-07-05 19:47:28 +08:00
/* <20> <> ʼ <EFBFBD> <CABC> Ԥ<EFBFBD> <D4A4> <EFBFBD> ӵķ<D3B5> <C4B7> <EFBFBD> <EFBFBD> ˵<EFBFBD> ַ */
2025-06-27 00:32:57 +08:00
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 ;
2025-07-05 19:47:28 +08:00
/* <20> ܼƷ <DCBC> <C6B7> <EFBFBD> count<6E> <74> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
2025-06-27 00:32:57 +08:00
while ( count & & is_running )
{
2025-07-05 19:47:28 +08:00
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݵ<EFBFBD> <DDB5> <EFBFBD> <EFBFBD> <EFBFBD> Զ<EFBFBD> <D4B6> */
2025-06-27 00:32:57 +08:00
sendto ( sock , send_data , rt_strlen ( send_data ) , 0 ,
( struct sockaddr * ) & server_addr , sizeof ( struct sockaddr ) ) ;
2025-07-05 19:47:28 +08:00
/* <20> ߳<EFBFBD> <DFB3> <EFBFBD> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB> ʱ<EFBFBD> <CAB1> */
2025-06-27 00:32:57 +08:00
rt_thread_mdelay ( 1000 ) ;
2025-07-05 19:47:28 +08:00
/* <20> <> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> һ */
2025-06-27 00:32:57 +08:00
count - - ;
}
if ( count = = 0 )
{
LOG_I ( " UDP client send data finished! " ) ;
}
2025-07-05 19:47:28 +08:00
/* <20> ر<EFBFBD> <D8B1> <EFBFBD> <EFBFBD> <EFBFBD> socket */
2025-06-27 00:32:57 +08:00
if ( sock > = 0 )
{
closesocket ( sock ) ;
sock = - 1 ;
}
started = 0 ;
is_running = 0 ;
}
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 tcpclient program \n " ) ;
rt_kprintf ( " --help Print help information \n " ) ;
}
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 tcpclient has started! " ) ;
LOG_I ( " Please stop tcpclient firstly, by: tcpclient --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