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

网站订单系统模板下载搜索引擎营销方案

网站订单系统模板下载,搜索引擎营销方案,网站建设的6个基本步骤,怎样通过阿里巴巴网站开发客户实现2个客户端之间互相聊天服务器要求:使用 select 模型实现接受多个客户端连接,以及转发消息客户端要求:使用 poll 模型解决 技能够 read 读取服务器发来的消息,又能够scanf读取键盘输入的信息 客户端服务器不允许开启额外线程和…

实现2个客户端之间互相聊天

服务器要求:使用 select 模型实现接受多个客户端连接,以及转发消息

客户端要求:使用 poll 模型解决 技能够 read 读取服务器发来的消息,又能够scanf读取键盘输入的信息 客户端服务器不允许开启额外线程和进程

服务器代码:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>// 最大客户端数量
#define MAX_CLIENTS 10
// 缓冲区大小
#define BUF_SIZE 1024// 向客户端数组中插入新客户端
void insert_client(int client_arr[], int *len, int new_fd) {for (int i = 0; i < MAX_CLIENTS; i++) {if (client_arr[i] == -1) { client_arr[i] = new_fd; (*len)++;          break;            }}
}// 从客户端数组中移除客户端
void remove_client(int client_arr[], int *len, int target_fd) {for (int i = 0; i < MAX_CLIENTS; i++) {if (client_arr[i] == target_fd) { client_arr[i] = -1; for (int j = i; j < MAX_CLIENTS - 1; j++) {client_arr[j] = client_arr[j + 1]; }(*len)--; break; }}
}int main(int argc, const char *argv[]) {// 检查参数if (argc < 2) {printf("请输入: %s 端口号\n", argv[0]);return 1;}short port = atoi(argv[1]); // 1. 创建服务器套接字int server_fd = socket(AF_INET, SOCK_STREAM, 0);if (server_fd == -1) {perror("socket error");return 1;}// 2. 绑定地址struct sockaddr_in server_addr = {0};server_addr.sin_family = AF_INET;        server_addr.sin_port = htons(port);      server_addr.sin_addr.s_addr = inet_addr{"0.0.0.0"}; if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("bind error");close(server_fd);return 1;}// 3. 监听连接if (listen(server_fd, 10) == -1) {perror("listen error");close(server_fd);return 1;}printf("服务器启动,端口: %d,等待客户端连接...\n", port);// select 相关变量fd_set read_fds, temp_fds; FD_ZERO(&read_fds);        FD_SET(server_fd, &read_fds); FD_SET(STDIN_FILENO, &read_fds); int max_fd = server_fd; // 客户端管理数组int client_fds[MAX_CLIENTS];for (int i = 0; i < MAX_CLIENTS; i++) {client_fds[i] = -1; }int client_count = 0; while (1) {// 每次 select 前复制集合(select 会修改集合)temp_fds = read_fds;// 4. 等待事件发生int activity = select(max_fd + 1, &temp_fds, NULL, NULL, NULL);if (activity == -1) {perror("select error");break;}// 5. 处理服务器套接字(新客户端连接)if (FD_ISSET(server_fd, &temp_fds)) {struct sockaddr_in client_addr;socklen_t client_addr_len = sizeof(client_addr);int client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len);if (client_fd == -1) {perror("accept error");continue;}printf("客户端连接: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));// 将新客户端加入监听集合和管理数组FD_SET(client_fd, &read_fds); if (client_fd > max_fd) {max_fd = client_fd; }insert_client(client_fds, &client_count, client_fd); }// 处理标准输入(服务器手动发消息,可选逻辑)else if (FD_ISSET(STDIN_FILENO, &temp_fds)) {char buf[BUF_SIZE] = {0};if (fgets(buf, BUF_SIZE, stdin) != NULL) {// 去掉换行符buf[strcspn(buf, "\n")] = '\0';}}// 处理客户端消息else {for (int i = 0; i < client_count; i++) {int curr_fd = client_fds[i];if (curr_fd == -1) continue; if (FD_ISSET(curr_fd, &temp_fds)) {char buf[BUF_SIZE] = {0};int len = recv(curr_fd, buf, BUF_SIZE, 0);// 客户端断开if (len <= 0) {printf("客户端断开: %d\n", curr_fd);FD_CLR(curr_fd, &read_fds); close(curr_fd);             remove_client(client_fds, &client_count, curr_fd); continue;}// 简单转发:发给其他所有客户端printf("收到客户端消息: %s (来自 fd: %d)\n", buf, curr_fd);for (int j = 0; j < client_count; j++) {int target_fd = client_fds[j];if (target_fd != -1 && target_fd != curr_fd) { send(target_fd, buf, len, 0);}}}}}}// 关闭资源for (int i = 0; i < client_count; i++) {close(client_fds[i]);}close(server_fd);return 0;
}

 客户端代码:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <poll.h>// 缓冲区大小
#define BUF_SIZE 1024int main(int argc, const char *argv[]) {// 检查参数if (argc < 3) {printf("请输入: %s 服务器IP 端口号\n", argv[0]);return 1;}const char *server_ip = argv[1];short port = atoi(argv[2]); // 1. 创建客户端套接字int sock_fd = socket(AF_INET, SOCK_STREAM, 0);if (sock_fd == -1) {perror("socket error");return 1;}// 2. 连接服务器struct sockaddr_in server_addr = {0};server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); if (inet_pton(AF_INET, server_ip, &server_addr.sin_addr) <= 0) {perror("inet_pton error");close(sock_fd);return 1;}if (connect(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("connect error");close(sock_fd);return 1;}printf("已连接服务器: %s:%d\n", server_ip, port);// poll 相关设置struct pollfd fds[2]; // 监听套接字fds[0].fd = sock_fd;        fds[0].events = POLLIN;     fds[0].revents = 0;         // 监听标准输入fds[1].fd = STDIN_FILENO;  fds[1].events = POLLIN;     fds[1].revents = 0;         while (1) {// 3. 等待事件(套接字或键盘输入)int ret = poll(fds, 2, -1); if (ret == -1) {perror("poll error");break;}// 4. 处理套接字消息(服务器发来的数据)if (fds[0].revents & POLLIN) {char buf[BUF_SIZE] = {0};int len = recv(sock_fd, buf, BUF_SIZE, 0);// 服务器断开if (len <= 0) {printf("服务器断开连接\n");close(sock_fd);return 0;}printf("服务器说: %s\n", buf);}// 5. 处理标准输入(客户端发消息给服务器)if (fds[1].revents & POLLIN) {char buf[BUF_SIZE] = {0};if (fgets(buf, BUF_SIZE, stdin) != NULL) {// 去掉换行符buf[strcspn(buf, "\n")] = '\0';// 发送给服务器send(sock_fd, buf, strlen(buf), 0);}}}// 关闭套接字close(sock_fd);return 0;
}

最终效果:

http://www.dtcms.com/wzjs/211266.html

相关文章:

  • 免费注册网站怎么做链接seo快速整站上排名教程
  • 天津企业网站定制服务宁波网站建设制作报价
  • 西安专业的网站优化百度问一问在线咨询客服
  • 西安便宜网站建设百度app关键词优化
  • 网站建设收费标准信息口碑营销的名词解释
  • 洛阳有没有做家教的网站seo销售
  • 住房和城乡建设网站 上海郑州企业网络推广外包
  • 网站架设百度推广运营
  • 做网站自己买服务器杭州网站推广大全
  • 个人网站备案要求网站搜索系统
  • 推广做任务 有哪些网站重庆网站建设推广
  • 网站优化seo网站架构优化北京seo方法
  • 电子商务网站开发目的肇庆疫情最新情况
  • pc网站和app哪个容易做百度广告怎么推广
  • 做网站赚钱缴税吗互联网营销怎么赚钱
  • 文化网站开发背景西seo优化排名
  • 做旅游网站犯法吗自己开平台怎么弄啊
  • 自适应网页和响应式网页区别百度seo 优化
  • 山西官方网站有哪些国际军事最新消息今天
  • 济南市住房城乡建设网站百度会员登录入口
  • 芜湖做网站公司seo学途论坛网
  • 喀什建设局网站东莞seo软件
  • 做代收的网站有哪些百度竞价运营
  • asia域名发布网站sem推广竞价托管公司
  • 网站建设项目安排计划表西安网络优化培训机构公司
  • 深圳营销型网站建设制作商长春关键词优化公司
  • wordpress 内链代码seo文章生成器
  • 泊头建网站百度可以发布广告吗
  • 公司网站没备案长春网站建设公司哪家好
  • 虚拟机做网站自动点击竞价广告软件