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

建立一个个人介绍网站沈阳网页模板建站

建立一个个人介绍网站,沈阳网页模板建站,宁波seo网络推广公司,网站建设报告怎么写一请求一线程 问题 当客户端数量较多时,使用单独线程为每个客户端处理请求可能导致系统资源的消耗过大和性能瓶颈。 资源消耗: 线程创建和管理开销:每个线程都有其创建和销毁的开销,特别是在高并发环境中,这种开销…

一请求一线程

问题

当客户端数量较多时,使用单独线程为每个客户端处理请求可能导致系统资源的消耗过大和性能瓶颈。

资源消耗:
  • 线程创建和管理开销:每个线程都有其创建和销毁的开销,特别是在高并发环境中,这种开销会显著增加。
  • 内存消耗:每个线程通常需要分配一定的栈空间,这会增加内存使用量。
  • 上下文切换:操作系统需要频繁地切换线程上下文,这会消耗CPU资源。
性能瓶颈:
  • 线程竞争:大量线程会导致线程之间竞争共享资源,如内存和CPU时间,降低整体性能。
  • 调度开销:操作系统调度大量线程时的开销可能会影响应用程序的响应时间和吞吐量。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libgen.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>#define BUFFER_LENGTH 1024// 客户端处理线程的例程
void *client_routine(void* arg) {int clientfd = *(int*)arg;  // 获取传入的客户端套接字描述符while (1) {char buffer[BUFFER_LENGTH];  // 定义接收缓冲区int len = recv(clientfd, buffer, BUFFER_LENGTH, 0);  // 接收数据if (len < 0) {// 接收数据出错perror("recv error");close(clientfd);  // 关闭客户端套接字break;} else if (len == 0) {// 客户端关闭连接close(clientfd);  // 关闭客户端套接字break;} else {// 打印接收到的数据printf("Recv: %s, %d byte(s)\n", buffer, len);}}return NULL;
}int main(int argc, char* argv[]) {if (argc < 2) {// 参数错误,未提供端口号printf("usage: %s port\n", basename(argv[0]));return -1;}int port = atoi(argv[1]);  // 从命令行参数获取端口号// 创建监听用的套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket creation failed");return 1;}// 配置套接字地址struct sockaddr_in addr;memset(&addr, 0, sizeof(struct sockaddr_in));  // 清空地址结构addr.sin_family = AF_INET;addr.sin_port = htons(port);  // 转换端口号为网络字节序addr.sin_addr.s_addr = INADDR_ANY;  // 绑定到所有可用的接口if (bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in))) {perror("bind failed");return 2;}if (listen(sockfd, 5) < 0) {perror("listen failed");return 3;}while (1) {struct sockaddr_in client_addr;memset(&client_addr, 0, sizeof(struct sockaddr_in));  // 清空客户端地址结构socklen_t client_len = sizeof(client_addr);// 接受客户端连接int clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);if (clientfd < 0) {perror("accept failed");continue;}// 为每个客户端创建一个线程pthread_t thread_id;if (pthread_create(&thread_id, NULL, client_routine, &clientfd) != 0) {perror("pthread_create failed");close(clientfd);  // 创建线程失败时关闭客户端套接字}// 可选:分离线程以避免线程资源泄漏pthread_detach(thread_id);}// 关闭监听套接字(实际上这部分代码永远不会到达)close(sockfd);return 0;
}

使用ifconfig查看服务器程序所在主机的IP地址。

首先启动所写的tcp服务器,即确保tcp_server_test.cpp已经编译并运行在虚拟机上,监听指定的端口(8888)。

打开三个网络调试助手(NetAssist),在每个助手中配置远端主机地址为你的tcp服务器地址(在虚拟机用ifconfig查看),端口设置为 8888,点击连接。可以分别向tcp服务器写数据。

利用epoll

优点:

高效:

epoll采用事件驱动的方式,仅在有事件发生时通知应用程序,避免了轮询带来的性能开销。

可扩展性

能够处理大量的文件描述符,适合高并发应用。

边缘触发

支持边缘触发(EPOLLET),在数据到达时通知一次,适合需要高效处理大量事件的场景。

缺点

复杂性

编程模型较为复杂,需要正确处理事件并维持数据流动性,可能导致代码较难维护。

资源消耗

虽然epoll高效,但在高负载情况下,资源使用仍然会增加,如内存和系统调用次数。

边缘触发处理

需要确保处理所有数据,否则可能错过事件,增加了编程的复杂性。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libgen.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
#include <sys/epoll.h>#define BUFFER_LENGTH 1024
#define EPOLL_SIZE 1024int main(int argc, char* argv[]) {if (argc < 2) {// 参数错误,未提供端口号printf("usage: %s port\n", basename(argv[0]));return -1;}int port = atoi(argv[1]);  // 从命令行参数获取端口号// 创建监听用的套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket creation failed");return 1;}// 配置套接字地址struct sockaddr_in addr;memset(&addr, 0, sizeof(struct sockaddr_in));  // 清空地址结构addr.sin_family = AF_INET;addr.sin_port = htons(port);  // 转换端口号为网络字节序addr.sin_addr.s_addr = INADDR_ANY;  // 绑定到所有可用的接口if (bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in))) {perror("bind failed");close(sockfd);return 2;}if (listen(sockfd, 5) < 0) {perror("listen failed");close(sockfd);return 3;}// 创建 epoll 实例int epfd = epoll_create1(0);  // 使用 epoll_create1(0) 代替 epoll_create(0)if (epfd < 0) {perror("epoll_create failed");close(sockfd);return 4;}struct epoll_event events[EPOLL_SIZE] = {0};// 添加监听套接字到 epoll 实例struct epoll_event ev;ev.events = EPOLLIN | EPOLLET;  // 设置为边缘触发模式ev.data.fd = sockfd;if (epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev) < 0) {perror("epoll_ctl failed");close(sockfd);close(epfd);return 5;}while (1) {// 等待事件发生int nready = epoll_wait(epfd, events, EPOLL_SIZE, -1);if (nready < 0) {perror("epoll_wait failed");break;  // 退出循环}for (int i = 0; i < nready; i++) {if (events[i].data.fd == sockfd) {struct sockaddr_in client_addr;memset(&client_addr, 0, sizeof(struct sockaddr_in));  // 清空客户端地址结构socklen_t client_len = sizeof(client_addr);// 接受客户端连接int clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);if (clientfd < 0) {perror("accept failed");continue;}// 将新的客户端套接字添加到 epoll 实例中,并设置为边缘触发模式ev.events = EPOLLIN | EPOLLET;ev.data.fd = clientfd;if (epoll_ctl(epfd, EPOLL_CTL_ADD, clientfd, &ev) < 0) {perror("epoll_ctl failed");close(clientfd);}} else {// 处理客户端套接字的事件int clientfd = events[i].data.fd;char buffer[BUFFER_LENGTH];  // 定义接收缓冲区int len;// 处理所有可用的数据while ((len = recv(clientfd, buffer, BUFFER_LENGTH, 0)) > 0) {buffer[len] = '\0';  // 添加字符串结束标志printf("Recv: %s, %d byte(s)\n", buffer, len);}if (len < 0) {perror("recv error");}// 客户端关闭连接或出错close(clientfd);  // 关闭客户端套接字epoll_ctl(epfd, EPOLL_CTL_DEL, clientfd, NULL);}}}// 关闭监听套接字和 epoll 实例close(sockfd);close(epfd);return 0;
}

推荐一下 

0voice · GitHub

http://www.yayakq.cn/news/388352/

相关文章:

  • discuz建站教程wordpress加载完再显示
  • 音乐网站开发技术在百度上怎么发布信息
  • 帝国cms 关闭网站wordpress 4.8 表情
  • asp.net网站设计wordpress相册修改
  • 合肥网站关键词排名太原区域调整最新消息
  • 企业摄影网站模板模板之家
  • 怎么做自己的网站链接深入浅出wordpress 中文 pdf
  • 怎么把别人网站的tag写上自己的哪些网站上可以做seo推广的
  • 网站优化公司大家好遵义网上制作网站
  • 北京工地网站建设如何制作网站的步骤
  • 网站开发就业前景wordpress站点地址灰显
  • 江苏网站建设哪家专业北京比较好的it公司
  • dede网站修改科技局是做什么的
  • 全国网页设计公司天津网站优化收费
  • 东莞php网站开发网站后台不显示文章内容
  • 企业网站项目的流程东莞网站建设推广技巧
  • 做网站的目的是什么深圳建网站兴田德润专业
  • 网站建设哪家最好用wordpress sae图床
  • 网站建设宣传广告语株洲网站建设企业
  • 男女做视频网站国外图床 wordpress
  • 做外汇看的国外网站wordpress 含演示数据库
  • 简述商务网站建设步骤做阿里巴巴网站公司
  • 网站建设设计书建设网站销售
  • 怎样建网站 步骤网络服务商的责任
  • 天津网站建设方案托管变身小说 wordpress
  • 龙口建网站效果好企业营销型网站建设
  • 大学生做社交网站腾讯企点聊天记录怎么恢复
  • 广州微型网站建设移动知识库管理系统
  • 如何在建设部网站查企业资质重庆建站网站流程及费用
  • 行业网站 源码专业类网站