爱站小工具,怎么在网上发布广告,福田网站建设,企业网站建设需要多少钱创造通信套接字socketint fd socket(AF_INET, SOCK_DGRAM, 0);sendto 用于通过 UDP 套接字 发送数据。recvfrom 用于通过 UDP 套接字 接收数据。//客户端单播
#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#incl…创造通信套接字socketint 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); //设置组播包的TTLTTL - 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; }