XFusion API v1.3.0
载入中...
搜索中...
未找到
examples/protocols/sockets/udp_server/main/xf_main.c

sockets udp 服务端 示例。

1
17/* ==================== [Includes] ========================================== */
18
19#include "lwip/err.h"
20#include "lwip/sockets.h"
21#include "lwip/sys.h"
22#include "lwip/netdb.h"
23#include "lwip/inet.h"
24
25#include "xf_utils.h"
26#include "xf_wifi.h"
27#include "xf_netif.h"
28#include "xf_osal.h"
29
30#include "ex_easy_wifi.h"
31
32/* ==================== [Defines] =========================================== */
33
34#define PORT CONFIG_EXAMPLE_PORT
35#define EXAMPLE_DELAY_MS 100
36#define CLIENT_IP_ADDR INADDR_ANY
37
38/* ==================== [Typedefs] ========================================== */
39
40/* ==================== [Static Prototypes] ================================= */
41
42static void _example_thread(void *argument);
43
44/* ==================== [Static Variables] ================================== */
45
46static const char *TAG = "ap";
47static const char *payload = "This is a message from server.";
48
49static xf_osal_thread_t s_thread_hdl = NULL;
50#define EX_THREAD_NAME "ex_thread"
51#define EX_THREAD_PRIORITY XF_OSAL_PRIORITY_NORMOL
52#define EX_THREAD_STACK_SIZE (1024 * 4)
55 .priority = EX_THREAD_PRIORITY,
56 .stack_size = EX_THREAD_STACK_SIZE,
57};
58
59/* ==================== [Macros] ============================================ */
60
61/* ==================== [Global Functions] ================================== */
62
63void xf_main(void)
64{
66 if (s_thread_hdl == NULL) {
67 XF_LOGE(TAG, "xf_osal_thread_create error");
68 return;
69 }
70}
71
72/* ==================== [Static Functions] ================================== */
73
74static void _example_thread(void *argument)
75{
76 UNUSED(argument);
77
79
80 char rx_buffer[128];
81 int addr_family = 0;
82 int ip_protocol = 0;
83 int sockfd = 0;
84
85 struct sockaddr_in dest_addr = {0};
86 struct sockaddr_in source_addr = {0};
87 struct timeval timeout = {0};
88
89 dest_addr.sin_addr.s_addr = htonl(CLIENT_IP_ADDR);
90 dest_addr.sin_family = AF_INET;
91 dest_addr.sin_port = htons(PORT);
92 addr_family = AF_INET;
93 ip_protocol = IPPROTO_IP;
94
95 sockfd = socket(addr_family, SOCK_DGRAM, ip_protocol);
96 if (sockfd < 0) {
97 XF_LOGE(TAG, "Unable to create socket: errno %d", errno);
98 goto l_err;
99 }
100 XF_LOGI(TAG, "Socket created");
101
102 /* 设置接收超时时间 */
103 timeout.tv_sec = 10;
104 timeout.tv_usec = 0;
105 setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
106
107 /* 绑定端口号 */
108 int err = bind(sockfd, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
109 if (err < 0) {
110 XF_LOGE(TAG, "Socket unable to bind: errno %d", errno);
111 goto l_err;
112 }
113 XF_LOGI(TAG, "Socket bound, port %d", PORT);
114
115 for (;;) {
117
118 XF_LOGI(TAG, "Waiting for data.");
119
120 socklen_t socklen = sizeof(source_addr);
121 int len = recvfrom(sockfd,
122 rx_buffer, sizeof(rx_buffer) - 1, 0,
123 (struct sockaddr *)&source_addr, &socklen);
124 if (len < 0) {
125 XF_LOGE(TAG, "recvfrom failed: errno %d", errno);
126 continue;
127 }
128
129 /* 获取来源地址 */
130 xf_ip4_addr_t src_ip4 = {0};
131 src_ip4.addr = source_addr.sin_addr.s_addr;
132
133 rx_buffer[len] = 0;
134 XF_LOGI(TAG, "Received %d bytes from " XF_IPSTR ":",
135 len, XF_IP2STR(&src_ip4));
136 XF_LOGI(TAG, "%s", rx_buffer);
137
138 /* 发送 */
139 int err = sendto(sockfd,
140 payload, strlen(payload), 0,
141 (struct sockaddr *)&source_addr, sizeof(source_addr));
142 if (err < 0) {
143 XF_LOGE(TAG, "Error occurred during sending: errno %d", errno);
144 break;
145 }
146 }
147
148l_err:;
149 if (sockfd != -1) {
150 XF_LOGE(TAG, "Shutting down socket...");
151 shutdown(sockfd, 0);
152 closesocket(sockfd);
153 }
155}
#define EX_THREAD_PRIORITY
#define EX_THREAD_STACK_SIZE
#define EX_THREAD_NAME
xf_err_t ex_easy_wifi_ap(void)
void xf_main(void)
Definition xf_main.c:28
#define XF_IPSTR
#define XF_IP2STR(ipaddr)
xf_err_t xf_osal_thread_delete(xf_osal_thread_t thread)
终止线程的执行。
xf_osal_thread_t xf_osal_thread_create(xf_osal_thread_func_t func, void *argument, const xf_osal_thread_attr_t *attr)
创建一个线程并将其添加到活动线程中。
void * xf_osal_thread_t
线程句柄。
xf_err_t xf_osal_delay_ms(uint32_t ms)
(睡眠)等待超时,以 ms 为单位。
#define TAG
Definition xf_main.c:24
static const xf_osal_thread_attr_t s_thread_attr
Definition xf_main.c:57
static void _example_thread(void *argument)
Definition xf_main.c:78
static xf_osal_thread_t s_thread_hdl
Definition xf_main.c:53
#define EXAMPLE_DELAY_MS
Definition xf_main.c:35
#define PORT
Definition xf_main.c:34
static const char * payload
Definition xf_main.c:46
#define CLIENT_IP_ADDR
Definition xf_main.c:40
线程的属性结构。
#define XF_LOGI(tag, format,...)
#define XF_LOGE(tag, format,...)
#define UNUSED(_x)
xf_wifi 包含 STA、AP 接口。