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

UDP网络聊天室

服务器端(未完成)

#include <header.h>
#define MAX_CLIENTS 100
#define MESSAGE_SIZE 1024
typedef struct node 
{char name[20];struct sockaddr_in client;struct node *next;
} node, *node_p;node_p create_link() 
{node_p H = (node_p)malloc(sizeof(node));if (H == NULL) {printf("申请内存失败\n");return NULL;}H->next = NULL;return H;
}node_p create_node(char *name, struct sockaddr_in client) 
{node_p new = (node_p)malloc(sizeof(node));if (new == NULL){printf("申请内存失败\n");return NULL;}strcpy(new->name, name);new->client = client;new->next = NULL;return new;
}void insert(node_p H, char *name, struct sockaddr_in client) 
{if (H == NULL) {printf("链表头节点为空\n");return;}node_p new = create_node(name, client);new->next = H->next;H->next = new;
}void remove_node(node_p H, struct sockaddr_in client)
{if (H == NULL) {printf("链表头节点为空\n");return;}node_p prev = H;node_p curr = H->next;while (curr != NULL){if (curr->client.sin_addr.s_addr == client.sin_addr.s_addr &&curr->client.sin_port == client.sin_port) {prev->next = curr->next;free(curr);return;}prev = curr;curr = curr->next;}
}void broadcast_message(int sfd, node_p H, char *message, struct sockaddr_in *exclude_client) 
{node_p curr = H->next;while (curr != NULL) {if (exclude_client == NULL || curr->client.sin_addr.s_addr != exclude_client->sin_addr.s_addr ||curr->client.sin_port != exclude_client->sin_port) {sendto(sfd, message, strlen(message), 0, (struct sockaddr*)&curr->client, sizeof(curr->client));}curr = curr->next;}
}int main(int argc, char *argv[]) 
{int sfd = socket(AF_INET, SOCK_DGRAM, 0);if (sfd == -1) {perror("socket");return 1;}char *server_ip=argv[1];int server_port=atoi(argv[2]);struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(server_port);sin.sin_addr.s_addr = inet_addr(server_ip);if (bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1) {perror("bind");return 1;}printf("服务器已启动\n");node_p clients = create_link();char rbuf[MESSAGE_SIZE];struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);while (1) {bzero(rbuf, sizeof(rbuf));int n = recvfrom(sfd, rbuf, sizeof(rbuf), 0, (struct sockaddr*)&cin, &addrlen);rbuf[n] = '\0';if (strncmp(rbuf, "LOGIN:", 6) == 0) {char *username = rbuf + 6;insert(clients, username, cin);printf("用户 %s 登录, IP: %s, 端口: %d\n", username, inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));char login_msg[MESSAGE_SIZE];snprintf(login_msg, sizeof(login_msg), "%s 已登录", username);broadcast_message(sfd, clients, login_msg, NULL);}else if (strncmp(rbuf, "MSG:", 4) == 0) {char *msg = rbuf + 4;char user_msg[MESSAGE_SIZE];snprintf(user_msg, sizeof(user_msg), "[%s]: %s", clients->name, msg);printf("用户 %s 发送了一条消息: %s\n", clients->name, msg);broadcast_message(sfd, clients, user_msg, &cin);}else if (strncmp(rbuf, "LOGOUT:", 7) == 0) {char *username = rbuf + 7;printf("用户 %s 下线, IP: %s, 端口: %d\n", username, inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));remove_node(clients, cin);char logout_msg[MESSAGE_SIZE];snprintf(logout_msg, sizeof(logout_msg), "%s 已下线", username);broadcast_message(sfd, clients, logout_msg, NULL);}else if (strncmp(rbuf, "SYSMSG:", 7) == 0) {char *sys_msg = rbuf + 7;broadcast_message(sfd, clients, sys_msg, NULL);}}close(sfd);return 0;
}

客户端(未完成)

#include <header.h>
#define MESSAGE_SIZE 1024int main(int argc, char *argv[])
{if (argc != 3) {printf("请依次输入正确的服务器ip地址和端口号!\n");return 1;}char *server_ip = argv[1];int server_port = atoi(argv[2]);int cfd = socket(AF_INET, SOCK_DGRAM, 0);if (cfd == -1){perror("socket");return 1;}struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(server_port);sin.sin_addr.s_addr = inet_addr(server_ip);struct pollfd pfd[2];pfd[0].fd = 0;  pfd[0].events = POLLIN;pfd[1].fd = cfd;pfd[1].events = POLLIN;char wbuf[MESSAGE_SIZE] = {0};char rbuf[MESSAGE_SIZE] = {0};char username[20] = {0};printf("请输入用户名---> ");scanf("%s", username);getchar();char login_message[MESSAGE_SIZE];snprintf(login_message, sizeof(login_message), "LOGIN:%s", username);sendto(cfd, login_message, strlen(login_message), 0, (struct sockaddr*)&sin, sizeof(sin));while (1) {int res = poll(pfd, 2, -1);if (res == -1) {perror("poll");return 1;}if (pfd[0].revents == POLLIN){bzero(wbuf, sizeof(wbuf));fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf) - 1] = '\0';  char message[MESSAGE_SIZE];snprintf(message, strlen("MSG:") + strlen(wbuf) + 1, "MSG:%s", wbuf);sendto(cfd, message, strlen(message), 0, (struct sockaddr*)&sin, sizeof(sin));printf("消息发送成功\n");}if (pfd[1].revents == POLLIN) {bzero(rbuf, sizeof(rbuf));recvfrom(cfd, rbuf, sizeof(rbuf), 0, NULL, NULL);if (strncmp(rbuf, "SYSMSG:", 7) == 0) {printf("%s\n", rbuf);}else{printf("收到的消息是: %s\n", rbuf);}}}close(cfd);return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • rockeylinux 搭建k8s 1.28.10
  • 探索Python编程乐趣:制作气泡反弹小游戏
  • 将C++ cv:mat 通过JNI 转换为jbtyearray,传到android端
  • Java中深拷贝和浅拷贝详解学习
  • D2Admin:企业中后台产品前端集成方案的探索与实践
  • adb 启动app并查看启动时间
  • 如何本地 Debug React 源码
  • 算法工程师需要学习C++的哪些知识?
  • Scala编程基础3 数组、映射、元组、集合
  • 社情民意调查主题和领域
  • XS2185一款八通道以太网供电控制器
  • 使用Spring Boot编写的小项目
  • 用例设计需遵循哪些规范标准?
  • FilterRegistrationBean
  • 条款9:利用destructors避免泄露资源
  • 2017 年终总结 —— 在路上
  • egg(89)--egg之redis的发布和订阅
  • JavaScript设计模式系列一:工厂模式
  • JavaWeb(学习笔记二)
  • Java超时控制的实现
  • Lsb图片隐写
  • MySQL几个简单SQL的优化
  • Spring Cloud Feign的两种使用姿势
  • spring security oauth2 password授权模式
  • text-decoration与color属性
  • vue.js框架原理浅析
  • Vue2.0 实现互斥
  • 创建一个Struts2项目maven 方式
  • 动态魔术使用DBMS_SQL
  • 技术胖1-4季视频复习— (看视频笔记)
  • 简单数学运算程序(不定期更新)
  • 排序算法之--选择排序
  • 系统认识JavaScript正则表达式
  • 字符串匹配基础上
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • ###STL(标准模板库)
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (11)MSP430F5529 定时器B
  • (C#)一个最简单的链表类
  • (第二周)效能测试
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)项目管理杂谈-我所期望的新人
  • .net core 依赖注入的基本用发
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .NET6 命令行启动及发布单个Exe文件
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • @ResponseBody
  • [ Algorithm ] N次方算法 N Square 动态规划解决