完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
UDP 协议是用于客户端-服务器模式的一种传输协议,如今的很多通信软件都是利用这个协议实现的,如腾讯 QQ 发送消息用的就是 UDP 协议。
本教程介绍了如何利用 socket 编程来实现一个 UDP 服务器,与客户端进行通信。 UDP 服务器的 socket 编程流程1. 创建 socket2. 将创建的 socket 绑定到一个 IP 地址和端口号上3. 等待接收数据报,处理完成后将结果返回到客户端4. 关闭 socket 如下图所示: 准备工作 获取示例代码 RT-Thread samples 软件包中已有一份该示例代码 udpserver.c,可以通过 Env 配置将示例代码加入到项目中。 RT-Thread online packages ---》 miscellaneous packages ---》 samples: RT-Thread kernel and components samples ---》 network sample options ---》 [network] udp server示例代码文件 /** 程序清单:udp 服务端 * * 这是一个 udp 服务端的例程 * 导出 udpserv 命令到控制终端 * 命令调用格式:udpserv * 无参数 * 程序功能:作为一个服务端,接收并显示客户端发来的数据 ,接收到 exit 退出程序*/#include 《rtthread.h》#include 《sys/socket.h》 /* 使用BSD socket,需要包含socket.h头文件 */#include “netdb.h”#define BUFSZ 1024static void udpserv(int argc, char **argv){ int sock; int bytes_read; char *recv_data; socklen_t addr_len; struct sockaddr_in server_addr, client_addr; /* 分配接收用的数据缓冲 */ recv_data = rt_malloc(BUFSZ); if (recv_data == RT_NULL) { /* 分配内存失败,返回 */ rt_kprintf(“No memory/n”); return; } /* 创建一个socket,类型是SOCK_DGRAM,UDP类型 */ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { rt_kprintf(“Socket error/n”); /* 释放接收用的数据缓冲 */ rt_free(recv_data); return; } /* 初始化服务端地址 */ server_addr.sin_family = AF_INET; server_addr.sin_port = htons(5000); server_addr.sin_addr.s_addr = INADDR_ANY; rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); /* 绑定socket到服务端地址 */ if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { /* 绑定地址失败 */ rt_kprintf(“Bind error/n”); /* 释放接收用的数据缓冲 */ rt_free(recv_data); return; } addr_len = sizeof(struct sockaddr); rt_kprintf(“UDPServer Waiting for client on port 5000.。。/n”); while (1) { /* 从sock中收取最大BUFSZ - 1字节数据 */ bytes_read = recvfrom(sock, recv_data, BUFSZ - 1, 0, (struct sockaddr *)&client_addr, &addr_len); /* UDP不同于TCP,它基本不会出现收取的数据失败的情况,除非设置了超时等待 */ recv_data[bytes_read] = ‘/0’; /* 把末端清零 */ /* 输出接收的数据 */ rt_kprintf(“/n(%s , %d) said : ”, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); rt_kprintf(“%s”, recv_data); /* 如果接收数据是exit,退出 */ if (strcmp(recv_data, “exit”) == 0) { closesocket(sock); /* 释放接收用的数据缓冲 */ rt_free(recv_data); break; } } return;}MSH_CMD_EXPORT(udpserv, a udp server sample);在 msh shell 中运行示例代码 在系统运行起来后,在 msh 命令行下输入命令 udpserv 即可让示例代码运行。 msh /》udpservUDPServer Waiting for client on port 5000.。。然后在电脑上开启一个 UDP 客户端,这里以网络调试助手为例。 如果 是 QEMU 平台的话要先绑定网卡和 IP 地址。 给服务器发送消息 预期结果 从服务器能接收到客户端发来的数据 发送 exit 到服务器,即可停止服务器的运行。 注意事项 请关闭防火墙之后,再运行此例程。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
786 浏览 0 评论
4210 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2520 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
2926 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
31442 浏览 11 评论
72894 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:18 , Processed in 0.957362 second(s), Total 70, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号