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

花都网站(建设信科网络)/小程序开发模板

花都网站(建设信科网络),小程序开发模板,新余做网站公司,南宁做网站 的一.项目需求&#xff1a; 如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息如果有人下线&#xff0c;其他用户可以收到这个人的下线信息服务器可以发送系统信息 二.服务器端 #include <myhead.h&…

一.项目需求:

  1. 如果有用户登录,其他用户可以收到这个人的登录信息
  2. 如果有人发送信息,其他用户可以收到这个人的群聊信息
  3. 如果有人下线,其他用户可以收到这个人的下线信息
  4. 服务器可以发送系统信息

二.服务器端

#include <myhead.h> //服务器
#define SER_IP "192.168.125.48"
#define SER_PORT 8888
#define MAX_CLIENTS 100
#define BUFFER_SIZE 1024typedef struct Node {struct sockaddr_in addr;char username[20];struct Node *next;
} Node, *List;typedef struct Msg {char type; // 'L' 登陆模式, 'M' 消息模式, 'Q' 下线模式, 'S' 系统消息char username[20];char message[BUFFER_SIZE];
} Message;List client_list = NULL;// 添加客户端
void add_client(struct sockaddr_in *addr, const char *username) {Node *node = malloc(sizeof(Node));memcpy(&(node->addr), addr, sizeof(struct sockaddr_in));strncpy(node->username, username, 19);node->next = client_list;client_list = node;
}// 移除客户端
void remove_client(Node *node) {Node **prev = &client_list;while (*prev && *prev != node) {prev = &(*prev)->next;}if (*prev) {Node *temp = *prev;*prev = node->next;free(temp);}
}// 广播消息
void broadcast_message(int sfd, const Message *msg,struct sockaddr_in *except_addr) {Node *current = client_list;Message to_send = *msg;to_send.message[sizeof(to_send.message) - 1] ='\0'; // 确保消息字符串以null终止while (current) {if (memcmp(&(current->addr), except_addr, sizeof(struct sockaddr_in)) !=0) {sendto(sfd, (const char *)&to_send, sizeof(Message), 0,(struct sockaddr *)&(current->addr),sizeof(struct sockaddr_in));}current = current->next;}
}// 查找客户端
Node *find_client_by_addr(struct sockaddr_in *addr) {Node *current = client_list;while (current) {if (memcmp(&(current->addr), addr, sizeof(struct sockaddr_in)) == 0) {return current;}current = current->next;}return NULL;
}int main() {int sfd = socket(AF_INET, SOCK_DGRAM, 0);if (sfd < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}int reuse = 1;if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) ==-1) {perror("setsockopt error");return -1;}struct sockaddr_in server_addr, client_addr;server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr(SER_IP);server_addr.sin_port = htons(SER_PORT);if (bind(sfd, (const struct sockaddr *)&server_addr, sizeof(server_addr)) <0) {perror("bind failed");exit(EXIT_FAILURE);}printf("************服务器**************\n");printf("**********等待客户端**************\n");char buffer[BUFFER_SIZE] = {0};struct timeval tv;fd_set readfds;int max_fd = sfd;tv.tv_sec = 5;tv.tv_usec = 0;while (1) {FD_ZERO(&readfds);FD_SET(sfd, &readfds);// 检查是否有新的客户端连接或消息int res = select(max_fd + 1, &readfds, NULL, NULL, &tv);if (res < 0) {perror("select error");break;} else if (res > 0) {if (FD_ISSET(sfd, &readfds)) {socklen_t client_len = sizeof(client_addr);int n = recvfrom(sfd, buffer, BUFFER_SIZE, 0,(struct sockaddr *)&client_addr, &client_len);if (n < 0) {perror("recvfrom error");continue;}buffer[n] = '\0'; // 确保字符串以null终止Message msg;memcpy(&msg, buffer,(n < sizeof(Message))? n: sizeof(Message)); // 防止缓冲区溢出switch (msg.type) {case 'L': // 客户端登录add_client(&client_addr, msg.username);printf("%s 已登录\n", msg.username);// 广播登录信息给所有客户端(除了发送者)Message login_msg;strncpy(login_msg.username, msg.username, 19);login_msg.type = 'L';login_msg.message[0] = '\0'; // 清空消息字段,因为是登录消息broadcast_message(sfd, &login_msg, &client_addr);break;case 'M': // 客户端发送消息printf("%s: %s\n", msg.username, msg.message);// 广播消息给所有客户端(除了发送者)broadcast_message(sfd, &msg, &client_addr);break;case 'Q': // 客户端退出{Node *node = find_client_by_addr(&client_addr);if (node) {printf("%s 已下线\n", node->username);Message quit_msg;strncpy(quit_msg.username, node->username, 19);quit_msg.type = 'Q';quit_msg.message[0] ='\0'; // 清空消息字段,因为是下线消息remove_client(node);broadcast_message(sfd, &quit_msg, &client_addr);}} break;case 'S': // 服务器系统消息printf("系统消息: %s\n", msg.message);// 广播系统消息给所有客户端broadcast_message(sfd, &msg, NULL);break;default:printf("未知的消息类型\n");break;}}}}close(sfd);return 0;
}

三.客户端

#include <myhead.h>
#define SER_IP "192.168.125.48"
#define SER_PORT 8888
#define BUFFER_SIZE 1024typedef struct Msg {char type; // 'L' 登陆模式, 'M' 消息模式, 'Q' 下线模式, 'S' 系统消息char username[20];char message[BUFFER_SIZE];
} Message;int main() {int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}struct sockaddr_in sin;memset(&sin, 0, sizeof(sin));sin.sin_family = AF_INET;sin.sin_addr.s_addr = inet_addr(SER_IP);sin.sin_port = htons(SER_PORT);char username[20];printf("输入您的名字: ");scanf("%19s", username); // 限制输入长度为19个字符,为null终止符留空间// 发送登录消息Message login_msg;login_msg.type = 'L';strncpy(login_msg.username, username, sizeof(login_msg.username) - 1);login_msg.message[0] = '\0'; // 清空消息字段,因为是登录消息sendto(sockfd, &login_msg, sizeof(login_msg), 0, (struct sockaddr *)&sin,sizeof(sin));char message[BUFFER_SIZE];char recv_buffer[BUFFER_SIZE];struct sockaddr_in from_addr;socklen_t len = sizeof(from_addr);while (1) {printf("输入消息 (or 'exit' to quit): ");if (scanf("%1023s", message) == EOF || strcmp(message, "exit") == 0) {// 发送退出消息Message quit_msg;quit_msg.type = 'Q';strncpy(quit_msg.username, username, sizeof(quit_msg.username) - 1);quit_msg.message[0] = '\0'; // 清空消息字段,因为是退出消息sendto(sockfd, &quit_msg, sizeof(quit_msg), 0,(struct sockaddr *)&sin, sizeof(sin));break;}while (getchar() != '\n'); // 清除输入缓冲区中的换行符// 发送消息到服务器Message send_msg;send_msg.type = 'M';strncpy(send_msg.username, username, sizeof(send_msg.username) - 1);strncpy(send_msg.message, message, sizeof(send_msg.message) - 1);send_msg.message[sizeof(send_msg.message) - 1] ='\0'; // 确保消息字符串以null终止sendto(sockfd, &send_msg, sizeof(send_msg), 0, (struct sockaddr *)&sin,sizeof(sin));// 接收服务器的广播消息(可能是其他客户端的消息或系统消息)int n = recvfrom(sockfd, recv_buffer, BUFFER_SIZE, 0,(struct sockaddr *)&from_addr, &len);if (n > 0) {Message *msg = (Message *)recv_buffer;recv_buffer[n] = '\0'; // 确保字符串以null终止switch (msg->type) {case 'L': // 登录通知printf("%s 已登录\n", msg->username);break;case 'M': // 群聊消息printf("%s: %s\n", msg->username, msg->message);break;case 'Q': // 下线通知printf("%s 已下线\n", msg->username);break;case 'S': // 系统消息printf("系统消息: %s\n", msg->message);break;default:printf("未知的消息类型\n");break;}}}close(sockfd);return 0;
}

不完善仅供参考

http://www.rdtb.cn/news/305.html

相关文章:

  • 网站中有哪些标签需要优化/产品推广网站哪个好
  • 柳州城市的城乡建设管理局网站/营销管理系统
  • 2017年网站设计/口碑营销的优势有哪些
  • 山东天狐做网站cms/南京seo优化
  • 网站开发哈尔滨网站开发公司/网络推广一般都干啥
  • 资深做网站公司/国家卫健委最新疫情报告
  • vs2010网站制作教程/网站定制
  • 广西临桂建设局网站/西安疫情最新数据
  • 网站托管共享服务器费用一年多少钱/网络推广法
  • 公司营销网站制作/seo裤子的关键词首页排名有哪些
  • 滕州市中远建设工程公司网站首页/整合营销的最高阶段是
  • 好的网站怎么设计师/众志seo
  • 网站原创文章规范/百度推广账户登录首页
  • 手表怎么在网站做推广/好看的html网页
  • 中国十大少儿编程教育品牌/seo草根博客
  • 微网站/大学生网页设计主题
  • 网页游戏网站开发/百度云盘网页版
  • 免费网站香港空间/云南百度推广开户
  • 有名的网站建设公司/2345网址导航怎么卸载
  • 山东最新疫情通报/长沙网站优化对策
  • 手机网站建设广州/注册域名后怎么建网站
  • 网上注册公司申请流程/seo推广培训
  • 南宁做网站哪家公司好/抖音seo系统
  • 安徽安庆网站建设公司/推广赚钱一个50元
  • wordpress+学校模版/哈尔滨优化推广公司
  • 北京病毒感染最新消息/站长工具seo综合查询怎么用
  • 国外做黄色网站/游戏推广平台
  • 手机网站 广告/长春网站建设制作
  • 网站备案几年备案一次/徐州seo建站
  • 织梦手机网站制作教程/百度关键词搜索技巧