news 2026/6/11 14:51:53

UDP通信

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UDP通信


创造通信套接字socket

int fd = socket(AF_INET, SOCK_DGRAM, 0);

sendto 用于通过 UDP 套接字 发送数据。

recvfrom 用于通过 UDP 套接字 接收数据。

//客户端单播 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define PORT 9999 #define BUFFER_SIZE 1024 int main(){ //创建UDP套接字 int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd == -1){ perror("创建套接字失败:"); return -1; } //绑定到本地端口 struct sockaddr_in local_addr; memset(&local_addr, 0, sizeof(local_addr)); local_addr.sin_family = AF_INET; local_addr.sin_port = htons(PORT); local_addr.sin_addr.s_addr = htonl(INADDR_ANY); int ret_bind = bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr)); if(ret_bind == -1){ perror("绑定失败:"); close(sockfd); return -1; } printf("监听广播端口:%d\n",PORT); //循环接收数据 while(1){ char buf[BUFFER_SIZE]; struct sockaddr_in sender_addr; socklen_t sender_addr_len = sizeof(sender_addr); ssize_t ret_recv = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&sender_addr, &sender_addr_len); if(ret_recv == -1){ perror("接收失败:"); continue; } buf[ret_recv] = '\0'; printf("收到广播信息:%s(来自 %s:%d)\n",buf,inet_ntoa(sender_addr.sin_addr),ntohs(sender_addr.sin_port)); } close(sockfd); return 0; }
服务端单播 #include <stdio.h> // 标准输入输出 #include <stdlib.h> // 标准库函数(如exit、malloc等) #include <string.h> // 字符串处理函数 #include <unistd.h> // Unix系统调用(如close、sleep等) #include <arpa/inet.h> // 网络地址转换函数 #include <sys/socket.h> // 套接字API #define PORT 9999 // 广播使用的端口号 #define BROADCAST_IP "255.255.255.255" // 广播IP地址(全局广播) int main(){ //创建UDP套接字 int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd == -1){ perror("套接字创建失败:"); return -1; } //启动广播权限 int opt = 1; int ret_set = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt)); if(ret_set == -1){ perror("启动广播失败:"); close(sockfd); return -1; } //配置广播目标地址 struct sockaddr_in broadcast_addr; memset(&broadcast_addr, 0, sizeof(broadcast_addr)); broadcast_addr.sin_family = AF_INET; broadcast_addr.sin_port = htons(PORT); broadcast_addr.sin_addr.s_addr = inet_addr(BROADCAST_IP); //发送广播数据 char message[] = "Hello!Broadcast!"; ssize_t ret_send = sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&broadcast_addr, sizeof(broadcast_addr)); if(ret_send == -1){ perror("发送失败:"); }else{ printf("广播发送成功:%s:%zd bytes\n",message,ret_send); } close(sockfd); return 0; }

setsockopt()函数用于任意类型、任意状态套接口的设置选项值

//客户端组播 #include <stdio.h> // 标准输入输出函数 #include <stdlib.h> // 标准库函数(如exit等) #include <string.h> // 字符串处理函数 #include <unistd.h> // Unix系统调用(如close等) #include <arpa/inet.h> // 网络地址转换函数 #include <sys/socket.h> // 套接字API #define PORT 8888 // 服务器监听端口 #define SERVER_IP "192.168.26.128" // 服务器IP地址 #define BUFFER_SIZE 1024 // 接收缓冲区大小 int main(){ //创建套接字 int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd == -1){ perror("创建套接字失败:"); return -1; } //配置服务器地址信息 struct sockaddr_in serverInfo; memset(&serverInfo, 0, sizeof(serverInfo)); serverInfo.sin_family = AF_INET; serverInfo.sin_port = htons(PORT); serverInfo.sin_addr.s_addr = inet_addr(SERVER_IP); //发送数据 char message[] = "Hello,UDP Server!"; ssize_t ret_sendto = sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&serverInfo, sizeof(serverInfo)); if(ret_sendto == -1){ perror("发送失败:"); close(sockfd); return -1; } printf("已经发送消息:%s\n",message); //接收回显消息 char buf[BUFFER_SIZE] = {0}; struct sockaddr_in fromInfo; socklen_t fromInfo_len = sizeof(fromInfo); ssize_t ret_recvfrom = recvfrom(sockfd, buf, sizeof(buf) - 1, 0, (struct sockaddr*)&fromInfo, &fromInfo_len); if(ret_recvfrom == -1){ perror("接收失败:"); }else{ buf[ret_recvfrom] = '\0'; printf("服务器回显:%s\n",buf); } close(sockfd); return 0; }
服务端组播 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define MULTICAST_IP "239.255.0.1" #define PORT 12345 #define BUFFER_SIZE 1024 int main(){ //创建套接字 int sockfd = socket(AF_INET,SOCK_DGRAM, 0); if(sockfd == -1){ perror("创建套接字失败:"); return -1; } //绑定套接字到本地端口 struct sockaddr_in local_addr; memset(&local_addr, 0, sizeof(local_addr)); local_addr.sin_family = AF_INET; local_addr.sin_port = htons(PORT); local_addr.sin_addr.s_addr = htonl(INADDR_ANY); int ret = bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr)); if(ret == -1){ perror("绑定失败:"); close(sockfd); return -1; } //加入组播组 struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_IP); mreq.imr_interface.s_addr = htonl(INADDR_ANY); int ret_set = setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); if(ret_set == -1){ perror("加入组播失败:"); close(sockfd); return -1; } printf("已经加入组播组 :%s,监听端口:%d \n",MULTICAST_IP, PORT); //循环接收数据 while(1){ char buf[BUFFER_SIZE]; struct sockaddr_in sender_addr; socklen_t sender_addr_len = sizeof(sender_addr); ssize_t ret_recv = recvfrom(sockfd, buf, sizeof(buf), 0 ,(struct sockaddr*)&sender_addr, &sender_addr_len); if(ret_recv == -1){ perror("接收失败:"); continue; } buf[ret_recv] = '\0';//添加字符串结束符 printf("收到来自 %s:%d 的组播消息:%s\n",inet_ntoa(sender_addr.sin_addr),ntohs(sender_addr.sin_port),buf); } return 0; }

//客户端广播 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define PORT 12345 #define MULTICAST_IP "239.255.0.1" int main(){ //创建UDP套接字 int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd == -1){ perror("创建套接字失败:"); return -1; } //配置组播目标地址 struct sockaddr_in multicast_addr; memset(&multicast_addr, 0 , sizeof(multicast_addr)); multicast_addr.sin_family = AF_INET; multicast_addr.sin_port = htons(PORT); multicast_addr.sin_addr.s_addr = inet_addr(MULTICAST_IP); //设置组播包的TTL(TTL -> Time to Live) int ttl = 1;//TTL = 1表示数据包仅在局域网内进行传播 int ret_set = setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)); if(ret_set == -1){ perror("加入组播失败:"); close(sockfd); return -1; } //发送数据到组播组 char message[] = "Hello! Multicast Group!"; ssize_t ret_send = sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&multicast_addr, sizeof(multicast_addr)); if(ret_send == -1){ perror("发送失败:"); }else{ printf("数据发送成功:%s:%zd bytes\n",message,ret_send); } return 0; }
服务端广播 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define PORT 8888 #define BUFFER_SIZE 1024 int main(){ //创建UDP套接字 int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd == -1){ perror("Socket创建失败:"); return -1; } //配置服务器地址结构体 struct sockaddr_in serverInfo; memset(&serverInfo, 0 , sizeof(serverInfo)); serverInfo.sin_family = AF_INET; serverInfo.sin_port = htons(PORT); serverInfo.sin_addr.s_addr = INADDR_ANY;//这里表示要监听所有网卡 //绑定套接字到地址和端口 int ret_bind = bind(sockfd, (struct sockaddr*)&serverInfo, sizeof(serverInfo)); if(ret_bind == -1){ perror("绑定失败:"); close(sockfd); return -1; } printf("UDP服务器已启动, 监听端口:%d \n",PORT); //循环接收并且回显数据 while(1){ char buf[BUFFER_SIZE] = {0}; struct sockaddr_in clientInfo; socklen_t clientInfo_len = sizeof(clientInfo); //接收数据 ssize_t recv_len = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&clientInfo, &clientInfo_len); if(recv_len == -1){ perror("接收数据失败:"); continue;//继续等待下一个数据包 } //打印客户端信息 printf("收到来自%s:%d的信息:%s\n",inet_ntoa(clientInfo.sin_addr), ntohs(clientInfo.sin_port),buf); //回显数据 ssize_t send_len = sendto(sockfd, buf, recv_len, 0, (struct sockaddr*)&clientInfo, clientInfo_len); if(send_len == -1){ perror("回显数据失败:"); } } close(sockfd); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 17:21:31

Android 基础入门教程反编译APK获取代码资源

1.11 反编译APK获取代码&资源 本节引言 "反编译Apk"&#xff0c;看上去好像好像很高端的样子&#xff0c;其实不然&#xff0c;就是通过某些反编译软件&#xff0c;对我们的APK进行反编译&#xff0c;从而获取程序的源代码&#xff0c;图片&#xff0c;XML资源等…

作者头像 李华
网站建设 2026/6/10 17:21:22

【毕业设计】基于Spring Boot的会议预定管理系统的设计与实现基于springboot高校会议室预订管理系统(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/10 18:26:09

SpellCraft加密工具架构解析与实战指南

项目速览 【免费下载链接】Abracadabra Abracadabra 魔曰&#xff0c;下一代文本加密工具 项目地址: https://gitcode.com/gh_mirrors/abra/Abracadabra SpellCraft是一款革命性的短文本加密工具&#xff0c;通过创新的多层加密架构&#xff0c;将普通内容转换为高度伪装…

作者头像 李华
网站建设 2026/6/10 20:49:35

京东金榜年度金奖出炉 京东JD FASHION爆款商品强势登榜

【大力财经】12月9日&#xff0c;2025京东金榜盛典于上海举行&#xff0c;正式揭晓2025年度获奖榜单。活动现场&#xff0c;京东JD FASHION多款产品斩获重磅奖项&#xff0c;伯希和冲锋衣裤、耐克跑步鞋、阿迪达斯运动休闲鞋、波司登男士羽绒服、海澜之家男士T恤、高梵女士羽绒…

作者头像 李华
网站建设 2026/6/10 13:52:16

终极指南:如何快速上手OpenAI一致性模型实现高效图像生成

终极指南&#xff1a;如何快速上手OpenAI一致性模型实现高效图像生成 【免费下载链接】diffusers-ct_imagenet64 项目地址: https://ai.gitcode.com/hf_mirrors/openai/diffusers-ct_imagenet64 一致性模型&#xff08;Consistency Models&#xff09;作为生成式AI领域…

作者头像 李华
网站建设 2026/6/10 17:19:51

39、C 源代码编译软件入门指南(上)

C 源代码编译软件入门指南(上) 1. 常见文件类型 在软件编译过程中,我们会遇到各种类型的文件,常见的有: - 源代码文件 :以 .c 、 .h 或 .cc 结尾。C 源代码文件可能出现在包目录的任何位置。C++ 源代码文件通常以 .cc 、 .C 或 .cxx 为后缀。 - 目标文…

作者头像 李华