SP32-C3, esp-idf 4.3.5,udp client 非阻塞式循环收发,提供个例程
时间: 2024-01-31 19:03:21 浏览: 71
UDP数据收发例程1
以下是ESP32-C3上的非阻塞式UDP client循环收发的完整示例代码:
```c
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define SERVER_IP "192.168.1.100"
#define SERVER_PORT 1234
void udp_client_task(void *pvParameters)
{
// 配置Wi-Fi连接
// ...
// 创建UDP套接字并设置为非阻塞模式
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
fcntl(sock, F_SETFL, O_NONBLOCK);
// 设置服务器地址和端口号
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);
while (1) {
// 发送数据包
const char *msg = "Hello, server!";
sendto(sock, msg, strlen(msg), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
// 接收数据包
char buf[1024];
struct sockaddr_in source_addr;
socklen_t socklen = sizeof(source_addr);
int len = recvfrom(sock, buf, sizeof(buf) - 1, 0, (struct sockaddr *)&source_addr, &socklen);
if (len < 0 && errno != EWOULDBLOCK) {
printf("Error receiving data: %d\n", errno);
} else if (len > 0) {
buf[len] = '\0';
printf("Received: %s\n", buf);
}
// 等待一段时间
vTaskDelay(pdMS_TO_TICKS(1000));
}
close(sock);
vTaskDelete(NULL);
}
void app_main()
{
xTaskCreate(udp_client_task, "udp_client_task", 4096, NULL, 5, NULL);
}
```
在该示例中,我们首先创建了一个UDP套接字并将其设置为非阻塞模式。然后设置服务器地址和端口号,并在一个循环中发送和接收UDP数据包。在接收数据包时,如果没有收到数据包,则继续循环。如果接收到数据包,则将其打印到控制台。最后,我们关闭套接字并删除任务。
请注意,该示例仅供参考。您需要根据您的具体要求进行修改和调整。
阅读全文