网络编程第三天

embedded/2024/11/14 1:06:12/

服务器:

#include<sys/types.h> // 支持套接字地址结构
#include <sys/socket.h> // 提供套接字API
#include <netinet/in.h> // 定义IP地址结构体
#include <string.h> // 提供字符串操作函数
#include <stdio.h> // 提供标准I/O操作函数
#include <arpa/inet.h> // 提供IP地址转换函数
#include <stdlib.h>
#include "string.h"
#include "pthread.h"// udo组播代码
int main(int argc, char *argv[])
{int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 创建UDP套接字if (sockfd < 0){perror("socket");return -1;}struct ip_mreq mreq; // 定义IP多播结构体mreq.imr_multiaddr.s_addr = inet_addr("224.10.10.10"); // 设置多播组IP地址.mreq.imr_interface.s_addr = INADDR_ANY; // 设置本地接口为任何接口// 加入多播组if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0){perror("setsockopt");return -1;}struct sockaddr_in server_addr; // 定义服务器地址结构体memset(&server_addr, 0, sizeof(server_addr)); // 初始化服务器地址结构体server_addr.sin_family = AF_INET; // 设置地址族为IPv4server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 设置服务器IP地址为任何地址server_addr.sin_port = htons(atoi(argv[1])); // 设置服务器端口号为8000// 绑定套接字到服务器地址if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){perror("bind");return -1;}char buffer[1024]; // 定义缓冲区struct sockaddr_in client_addr; // 定义客户端地址结构体socklen_t client_addr_len = sizeof(client_addr); // 定义客户端地址长度while (1){memset(buffer, 0, sizeof(buffer)); // 清空缓冲区int len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &client_addr_len); // 接收数据if(strncmp(buffer,"start",5)==0){char buf[1024];snprintf(buf,1024,"%s:%d 上线了",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&server_addr,client_addr_len);continue;}else if(strncmp(buffer,"end",3)==0){char buf[1024];snprintf(buf,1024,"%s:%d 下线了",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&server_addr,client_addr_len);continue;}if (len < 0){perror("recvfrom");continue;}buffer[len] = '\0';printf("Received message: %s\n", buffer); // 打印接收到的消息}return 0;
}

客户端:

#include<sys/types.h> // 支持套接字地址结构
#include <sys/socket.h> // 提供套接字API
#include <netinet/in.h> // 定义IP地址结构体
#include <string.h> // 提供字符串操作函数
#include <stdio.h> // 提供标准I/O操作函数
#include <arpa/inet.h> // 提供IP地址转换函数
#include <stdlib.h>
#include "string.h"
#include "pthread.h"
#include "signal.h"int sockfd;
struct sockaddr_in mcast_addr; // 定义组播地址结构体void func(void)
{sendto(sockfd, "end", strlen("end"), 0, (struct sockaddr *)&mcast_addr, sizeof(mcast_addr));exit(0);
}// UDP组播
int main(int argc, char *argv[])
{sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 创建UDP套接字if (sockfd < 0){perror("socket");return -1;}mcast_addr.sin_family = AF_INET; // 设置地址族为IPv4mcast_addr.sin_addr.s_addr = inet_addr("224.10.10.10"); // 设置组播组IP地址mcast_addr.sin_port = htons(atoi(argv[1])); // 设置组播组端口号sendto(sockfd, "start", strlen("start"), 0, (struct sockaddr *)&mcast_addr, sizeof(mcast_addr));signal(SIGINT, (void *)func);// 循环发送数据while (1){char buffer[1024];printf("Enter message to send: ");fgets(buffer, sizeof(buffer), stdin);buffer[strlen(buffer) - 1] = '\0'; // 去掉fgets获取的回车int len = sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&mcast_addr, sizeof(mcast_addr));if (len < 0){perror("sendto");continue;}}return 0;
}


http://www.ppmy.cn/embedded/98628.html

相关文章

Java学习笔记(01)抽象类与抽象方法

abstract修饰抽象类 此类称为抽象类抽象类不能实例化抽象类是包含构造器的&#xff0c;因为子类对象实例化时&#xff0c;需要直接或间接的调用到父类的构造器。抽象类中可以没有抽象方法&#xff0c;反之&#xff0c;抽象方法所在的类&#xff0c;一定是抽象类。 abstract修…

一起学习LeetCode热题100道(47/100)

47.从前序与中序遍历序列构造二叉树(学习) 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9…

qt使用menu

思路&#xff1a;实例化一个QMenu的对象&#xff0c;然后通过函数addAction添加里面的子项。然后重写鼠标事件&#xff0c;比如当双击鼠标的时候&#xff0c;调用实例化对象的exec()函数&#xff0c;exec函数内传入重写的鼠标事件的全局坐标&#xff0c;就可以在鼠标点击的位置…

鹭鹰优化算法SBOA优化RBF神经网络的扩散速度实现多数入多输出数据预测,可以更改数据集(MATLAB代码)

一、鹭鹰优化算法介绍 鹭鹰优化算法&#xff08;Secretary Bird Optimization Algorithm, SBOA&#xff09;是一种新型的元启发式算法&#xff0c;它于2024年4月由Youfa Fu等人提出&#xff0c;并发表在SCI人工智能二区顶刊《Artificial Intelligence Review》上。该算法的灵感…

SQL高级编程:掌握自定义函数和过程的艺术

标题&#xff1a;SQL高级编程&#xff1a;掌握自定义函数和过程的艺术 在SQL的世界里&#xff0c;数据操作不仅仅局限于简单的查询和更新。通过自定义函数&#xff08;User-Defined Functions, UDFs&#xff09;和存储过程&#xff08;Stored Procedures&#xff09;&#xff…

Linux源码阅读笔记-USB设备驱动架构

总线速度及主机控制器 USB系统架构 USB系统主机端提供为4个引脚的A型接口&#xff0c;USB外围设备通过4个引脚的B型接口和主机端连接。那4个引脚&#xff08;一条电压线VBUS、一条地线GND、一条正方向传输数据的D和一条反方向传输数据的D-线。&#xff09;USB主机和USB设备收发…

平衡日常工作与提升式学习话题有感

文章目录 前言1.工作是什么&#xff1f;2.怎么提升技术&#xff1f;3.工作/学习与生活的平衡总结 前言 这篇博客是针对程序员如何平衡日常编码工作与提升式学习&#xff1f;这个话题进行的个人观点阐述&#xff0c;个人所思所想罢了。 刚毕业没几年&#xff0c;水平有限&#…

交流220V转5V100MA非隔离降压芯片应用在烧水壶上的设计与实现

### 交流220V转5V100MA非隔离降压芯片应用在烧水壶上的设计与实现 #### 引言 随着科技的不断发展&#xff0c;智能家居产品逐渐走进千家万户。烧水壶作为日常生活中常用的电器之一&#xff0c;其智能化和安全性也越来越受到消费者的关注。本文将介绍一种基于AH8652芯片的交流…