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

可信网站图标 费流量品牌推广营销平台

可信网站图标 费流量,品牌推广营销平台,怎么做物流网站,wordpress数据过滤实现2个客户端之间互相聊天 要求: 1、服务器使用 select 模型实现接受多个客户端连接,以及转发消息 2、客户端要求:使用 poll 模型解决 技能够 read 读取服务器发来的消息,又能够scanf读取键盘输入的信息 3、客户端服务器不允许开…

实现2个客户端之间互相聊天
要求:
1、服务器使用 select 模型实现接受多个客户端连接,以及转发消息
2、客户端要求:使用 poll 模型解决 技能够 read 读取服务器发来的消息,又能够scanf读取键盘输入的信息
3、客户端服务器不允许开启额外线程和进程

服务器代码 (select模型)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/select.h>#define MAX_CLIENTS 10
#define BUFFER_SIZE 1024int main(int argc, char *argv[]) {if (argc != 2) {printf("Usage: %s <port>\n", argv[0]);return 1;}int server_fd, new_socket, client_sockets[MAX_CLIENTS];struct sockaddr_in address;int opt = 1;int addrlen = sizeof(address);char buffer[BUFFER_SIZE] = {0};// 初始化客户端socket数组for (int i = 0; i < MAX_CLIENTS; i++) {client_sockets[i] = 0;}// 创建socketif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// 设置socket选项if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {perror("setsockopt");exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(atoi(argv[1]));// 绑定socketif (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 监听if (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}printf("Server started on port %d\n", atoi(argv[1]));fd_set readfds;int max_sd, activity;while (1) {FD_ZERO(&readfds);FD_SET(server_fd, &readfds);max_sd = server_fd;// 添加客户端socket到集合for (int i = 0; i < MAX_CLIENTS; i++) {if (client_sockets[i] > 0) {FD_SET(client_sockets[i], &readfds);}if (client_sockets[i] > max_sd) {max_sd = client_sockets[i];}}// 使用select等待活动activity = select(max_sd + 1, &readfds, NULL, NULL, NULL);if ((activity < 0) && (errno != EINTR)) {perror("select error");}// 检查新连接if (FD_ISSET(server_fd, &readfds)) {if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("accept");exit(EXIT_FAILURE);}printf("New connection, socket fd: %d, ip: %s, port: %d\n",new_socket, inet_ntoa(address.sin_addr), ntohs(address.sin_port));// 添加新socket到数组for (int i = 0; i < MAX_CLIENTS; i++) {if (client_sockets[i] == 0) {client_sockets[i] = new_socket;printf("Adding to list of sockets as %d\n", i);break;}}}// 检查客户端数据for (int i = 0; i < MAX_CLIENTS; i++) {int sd = client_sockets[i];if (FD_ISSET(sd, &readfds)) {int valread = read(sd, buffer, BUFFER_SIZE);if (valread == 0) {// 客户端断开连接getpeername(sd, (struct sockaddr*)&address, (socklen_t*)&addrlen);printf("Host disconnected, ip: %s, port: %d\n",inet_ntoa(address.sin_addr), ntohs(address.sin_port));close(sd);client_sockets[i] = 0;} else {// 转发消息给所有客户端buffer[valread] = '\0';printf("Forwarding message: %s\n", buffer);for (int j = 0; j < MAX_CLIENTS; j++) {if (client_sockets[j] > 0 && client_sockets[j] != sd) {send(client_sockets[j], buffer, strlen(buffer), 0);}}}}}}return 0;
}

客户端代码 (poll模型)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <poll.h>#define BUFFER_SIZE 1024int main(int argc, char *argv[]) {if (argc != 3) {printf("Usage: %s <ip> <port>\n", argv[0]);return 1;}int sock = 0;struct sockaddr_in serv_addr;char buffer[BUFFER_SIZE] = {0};struct pollfd fds[2];// 创建socketif ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("socket creation failed");return -1;}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(atoi(argv[2]));// 转换IP地址if (inet_pton(AF_INET, argv[1], &serv_addr.sin_addr) <= 0) {perror("invalid address");return -1;}// 连接服务器if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {perror("connection failed");return -1;}printf("Connected to server\n");// 设置poll结构fds[0].fd = STDIN_FILENO;    // 标准输入fds[0].events = POLLIN;fds[1].fd = sock;            // socketfds[1].events = POLLIN;while (1) {int ret = poll(fds, 2, -1); // 无限等待if (ret == -1) {perror("poll error");break;}// 检查键盘输入if (fds[0].revents & POLLIN) {memset(buffer, 0, BUFFER_SIZE);if (fgets(buffer, BUFFER_SIZE, stdin) == NULL) {break;}// 发送消息到服务器send(sock, buffer, strlen(buffer), 0);}// 检查服务器消息if (fds[1].revents & POLLIN) {memset(buffer, 0, BUFFER_SIZE);int len = recv(sock, buffer, BUFFER_SIZE, 0);if (len <= 0) {printf("Server disconnected\n");break;}printf("Received: %s", buffer);}}close(sock);return 0;
}

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

相关文章:

  • 多语言网站建设 技术宁波seo优化公司排名
  • wordpress xml rss南宁seo主管
  • 做全网营销型网站建设seo内部优化方式包括
  • 建设部建造师强制注销网站新媒体运营岗位职责
  • 网站开始怎么做的电脑办公软件培训班
  • 网站建设公司内部情况网站流量指标有哪些
  • 品牌企业seo咨询优化关键词排名公司
  • 上海有名的做网站的公司如何制作网页
  • 南宁培训网站建设人民日报最新头条10条
  • 贵阳手机网站开发汕头企业网络推广
  • 加强统战门户网站建设适合seo优化的网站
  • 怎么自己学着做网站2021年搜索引擎排名
  • 免费建设网站的好么磁力在线搜索引擎
  • 都江堰旅游门户网站怎么在网络上推广
  • 浙江建设培训考试网站百度学术搜索
  • 哈尔滨的网站建设公司宁波seo网络优化公司
  • 广州知名网站建设性价比高关键词挖掘工具站
  • 中国建设工程网官网查询朝阳seo
  • 网站开发常用的数据库廊坊百度关键词排名平台
  • 广州专业手机网站设计seo咨询师招聘
  • 我的世界日本怎么做视频网站北京官网优化公司
  • 网站开发需要多少钱友情链接属于免费推广吗
  • 如何让网站自适应手机官方百度app下载
  • nh网站建设互联网营销师培训教程
  • 长沙正规制作网站公司seo优化操作
  • 平顶山做网站哪家好电脑培训班多少费用
  • 那个网站可以找人做设计师百度竞价排名背后的伦理问题
  • 做网站后台用什么语言好搜什么关键词能找到网站
  • 文旅网站界面设计西点培训
  • 百度商桥的代码放到网站里如何制作简单的网页链接