socket编程 ------ UDP服务器
void vLANcommunication( void *pvParameters ) { int32 listenfd; do{ listenfd = socket(AF_INET, SOCK_DGRAM, 0); if(listenfd == -1) { debug("ESP8266 UDP server task > socket error\n"); vTaskDelay(1000/portTICK_RATE_MS); } }while(listenfd == -1); debug("---------------UDP server task > socket ok\n"); struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr));/* Zero out structure */ server_addr.sin_family = AF_INET; /* Internet address family,AF_INET表示IPv4*/ server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_len = sizeof(server_addr); server_addr.sin_port = htons(6666); /* Local port */ int32 ret; do{ ret = bind(listenfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (ret != 0) { debug("ESP8266 UDP server task > bind fail: %d\n",ret); vTaskDelay(1000/portTICK_RATE_MS); } }while(ret != 0); debug("---------------UDP server task > bind ok\n"); u8 *recv_buf = (u8 *)zalloc(128 * sizeof(u8)); int32 len = sizeof(struct sockaddr_in); struct sockaddr_in remote_addr; int32 recbytes; u16 i; u8 tmp_index; u8 udp_RxBuf[50];//单条命令不能超过50字节 u8 udp_RxBuf_index = 0; u8 udp_package_length; u16 cmd; for(;;) { //缓存的数据需要一次性读出来,否则余下的数据读取不到 recbytes = recvfrom(listenfd, recv_buf, 128, 0, (struct sockaddr *)&remote_addr, (socklen_t *)&len);
sendto(listenfd, recv_buf, recbytes, 0, (struct sockaddr *)&remote_addr, len);// debug("receive a UDP package\n"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
2017-11-08 Qt ------ QString 操作
2017-11-08 Qt ------ QProcess,启动外部进程,进程间通信
2016-11-08 UDP ------ UDP Broadcast Address