当前位置: 首页 > news >正文

作业5.26

定义一些常量和数据结构来存储用户信息和消息。 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define MAX_USERS 100 // 最大用户数
#define MAX_MESSAGE_LENGTH 256 // 最大消息长度
#define SERVER_PORT 8888 // 服务器端口// 用户信息结构体
typedef struct {int id;struct sockaddr_in addr;int is_online;
} User;// 消息结构体
typedef struct {User user;char message[MAX_MESSAGE_LENGTH];
} Message;// 用户数组
User users[MAX_USERS];
int user_count = 0;// 添加用户
void add_user(User user) {users[user_count++] = user;
}// 移除用户
void remove_user(int id) {int i;for (i = 0; i < user_count; i++) {if (users[i].id == id) {users[i].is_online = 0;break;}}
}// 发送消息给所有用户(除了发送者)
void send_message_to_all(Message msg, int sender_id) {int i;for (i = 0; i < user_count; i++) {if (users[i].id != sender_id && users[i].is_online) {sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr*)&users[i].addr, sizeof(users[i].addr));}}
}

 服务器端的代码:

int main() {int sockfd;struct sockaddr_in server_addr, client_addr;socklen_t addr_len = sizeof(client_addr);Message msg;// 创建UDP socketif ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {perror("socket creation failed");exit(EXIT_FAILURE);}// 设置服务器地址和端口memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(SERVER_PORT);// 绑定socket到服务器地址和端口if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {perror("bind failed");exit(EXIT_FAILURE);}printf("Server is listening on port %d\n", SERVER_PORT);// 主循环接收消息while (1) {// 接收客户端消息if (recvfrom(sockfd, &msg, sizeof(msg), 0, (struct sockaddr*)&client_addr, &addr_len) == -1) {perror("recvfrom failed");continue;}// 处理消息// ...// 发送消息给所有用户(除了发送者)send_message_to_all(msg, msg.user.id);}close(sockfd);return 0;
}

 客户端的代码:

int main() {int sockfd;struct sockaddr_in server_addr;Message msg;// 创建UDP socketif ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {perror("socket creation failed");exit(EXIT_FAILURE);}// 设置服务器地址和端口memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(SERVER_PORT);// 用户登录,发送登录消息给服务器// ...// 创建接收消息的线程// ...// 主循环发送消息while (1) {// 读取用户输入的消息// ...// 发送消息给服务器sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr*)&server_addr, sizeof(server_addr));}close(sockfd);return 0;
}

http://www.lryc.cn/news/353860.html

相关文章:

  • 银河麒麟服务器系统xshell连接之后主动断开,报错socket error event:32 Error:10053问题分析
  • 蓝桥杯算法心得——李白打酒(加强版)
  • java练习2
  • 【安装笔记-20240523-Windows-安装测试 ShareX】
  • 2024年150道高频Java面试题(七十一)
  • 【深度学习】2.单层感知机
  • JS经常碰见的报错问题
  • 纯前端实现截图功能
  • 【网络协议】应用层协议--HTTP
  • 【图书推荐】《Vue.js 3.x+Element Plus从入门到精通(视频教学版)》
  • 抖店如何打造出爆品?学好这几招,轻松打爆新品流量
  • 软件需求规范说明模板
  • vs2013使用qt Linguist以及tr不生效问题
  • Leetcode 3163. String Compression III
  • Java匿名内部类的使用
  • 把自己的垃圾代码发布到官方中央仓库
  • 单机一天轻松300+ 最新微信小程序拼多多+京东全自动掘金项目、
  • 线性回归模型之套索回归
  • 解决文件夹打开出错问题:原因、数据恢复与预防措施
  • Spring:面向切面(AOP)
  • 本地镜像文件怎么导入docker desktop
  • 【机器学习-23】关联规则(Apriori)算法:介绍、应用与实现
  • Gradle筑基——Gradle Maven仓库管理
  • c++11:智能指针的种类以及使用场景
  • RabbitMQ-默认读、写方式介绍
  • 阿里云百炼大模型使用
  • 亲测有效,通过接口实现完美身份证号有效性验证+身份证与姓名匹配查询身份实名认证接口(实时)
  • 试题11 输出什么?
  • 对vue3/core源码ref.ts文件API的认识过程
  • AWS迁移与传输之AWS DMS