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

关于做好学院网站建设的要求做网络竞拍的网站需要什么

关于做好学院网站建设的要求,做网络竞拍的网站需要什么,百度搜索量查询,自行建网站 所需费用网络I/O模型 同步I/O阻塞I/O非阻塞I/OI/O多路复用select函数接口示例 poll函数接口示例 poll 和 select 的区别epoll原理#xff1a;示例 异步I/O 同步I/O 阻塞I/O 一个基本的C/S模型如下图所图#xff1a;其中 listen()、connect()、write()、read() 都是阻塞I/O#xff0… 网络I/O模型 同步I/O阻塞I/O非阻塞I/OI/O多路复用select函数接口示例 poll函数接口示例 poll 和 select 的区别epoll原理示例 异步I/O 同步I/O 阻塞I/O 一个基本的C/S模型如下图所图其中 listen()、connect()、write()、read() 都是阻塞I/O用户态的进程在执行这些操作时会陷入内核态并被挂起。直到 socket() 上有数据可读/写时进程才会从内核态切换到用户态并完成数据在内核态和用户态之间的复制。 int fd open(file.txt, O_RDONLY); char buffer[100]; ssize_t bytes_read read(fd, buffer, sizeof(buffer)); // 阻塞 close(fd);非阻塞I/O I/O多路复用 select select() 函数是一个用于多路复用I/O的系统调用允许程序同时监控多个文件描述符如套接字、管道、终端等的可读、可写或异常状态。 函数接口 #include sys/select.hint select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);其中 nfds: 整型变量表示在所有集合中最大的文件描述符加1。这是为了告诉select()需要检查的文件描述符范围。实际上你只需要提供所有被监控的文件描述符中的最大值加1即可。readfds: 指向fd_set结构的指针用于存放待检查可读性的文件描述符集合。如果某个文件描述符在此集合中并且变为可读select()返回后该文件描述符在集合中的状态仍会被保持为已设置。writefds: 用于存放待检查可写性的文件描述符集合。exceptfds: 用于存放待检查异常条件的文件描述符集合。timeout: 指向timeval结构的指针用来指定select()调用的最大等待时间。如果为NULLselect()将一直阻塞直到有文件描述符满足条件如果不为NULL且值为(0, 0)则select()会立即返回不进行等待如果指定了具体的时间则select()最多等待指定的时间。 返回值 正值: 返回的是已就绪的文件描述符的数量包括可读、可写或异常的。注意这个值并不直接告诉你哪些描述符就绪你需要通过FD_ISSET宏检查集合来确定具体哪些描述符准备好了。 0: 表示在指定的超时时间内没有文件描述符变为就绪状态。 -1: 表示调用出错此时可以查看errno来获取具体的错误信息。 示例 void updateReadSet(std::unordered_setint clientFds, int maxFd, int sockFd, fd_set readSet) {maxFd sockFd;FD_ZERO(readSet);FD_SET(sockFd, readSet);for (const auto clientFd : clientFds) {if (clientFd maxFd) {maxFd clientFd;}FD_SET(clientFd, readSet);} }void handlerClient(int clientFd) {std::string msg;if (not EchoServer::RecvMsg(clientFd, msg)) {return;}EchoServer::SendMsg(clientFd, msg); }int main(int argc, char *argv[]) {if (argc ! 3) {std::cout invalid input std::endl;std::cout example: ./Select 0.0.0.0 1688 std::endl;return -1;}int sockFd EchoServer::CreateListenSocket(argv[1], atoi(argv[2]), false);if (sockFd 0) {return -1;}int maxFd;fd_set readSet;EchoServer::SetNotBlock(sockFd);std::unordered_setint clientFds;while (true) {updateReadSet(clientFds, maxFd, sockFd, readSet);int ret select(maxFd 1, readSet, NULL, NULL, NULL);if (ret 0) {if (ret 0) perror(select failed);continue;}for (int i 0; i maxFd; i) {if (not FD_ISSET(i, readSet)) {continue;}if (i sockFd) { // 监听的sockFd可读则表示有新的链接EchoServer::LoopAccept(sockFd, 1024, [clientFds](int clientFd) {clientFds.insert(clientFd); // 新增到要监听的fd集合中});continue;}handlerClient(i);clientFds.erase(i);close(i);}}return 0; } poll 在 select() 中文件描述符集合是由一个大小为1024的位图实现的为了支持监听更多的文件描述符poll 结构体数组存放描述符集合。 struct pollfd {int fd; // 文件描述符short events; // 监听的事件short revents; // 返回的事件 }函数接口 #include poll.h // nfds 指明fds数组的大小 int poll(struct pollfd *fds, nfds_t nfds, int timeout);示例 void updateFds(std::unordered_setint clientFds, pollfd **fds, int nfds) {if (*fds ! nullptr) {delete[](*fds);}nfds clientFds.size();*fds new pollfd[nfds];int index 0;for (const auto clientFd : clientFds) {(*fds)[index].fd clientFd;(*fds)[index].events POLLIN;(*fds)[index].revents 0;index;} }void handlerClient(int clientFd) {std::string msg;if (not EchoServer::RecvMsg(clientFd, msg)) {return;}EchoServer::SendMsg(clientFd, msg); }int main(int argc, char *argv[]) {if (argc ! 3) {std::cout invalid input std::endl;std::cout example: ./Poll 0.0.0.0 1688 std::endl;return -1;}int sockFd EchoServer::CreateListenSocket(argv[1], atoi(argv[2]), false);if (sockFd 0) {return -1;}int nfds 0;pollfd *fds nullptr;std::unordered_setint clientFds;clientFds.insert(sockFd);EchoServer::SetNotBlock(sockFd);while (true) {updateFds(clientFds, fds, nfds);int ret poll(fds, nfds, -1);if (ret 0) {if (ret 0) perror(poll failed);continue;}for (int i 0; i nfds; i) {if (not(fds[i].revents POLLIN)) {continue;}int curFd fds[i].fd;if (curFd sockFd) {EchoServer::LoopAccept(sockFd, 1024, [clientFds](int clientFd) {clientFds.insert(clientFd); // 新增到要监听的fd集合中});continue;}handlerClient(curFd);clientFds.erase(curFd);close(curFd);}}return 0; } poll 和 select 的区别 数据结构和参数 select: 使用固定大小的位图fd_set来表示文件描述符集合上限为1024.poll: 使用动态数组pollfd 结构体数组来表示文件描述符集合。 性能 select: 每次调用时用户态的文件描述符集合需要复制到内核态。poll: 通过传递指针的方式避免了每次调用时复制整个文件描述符集合到内核。 epoll 原理 事件注册使用epoll_create创建一个epoll文件描述符然后通过epoll_ctl向这个文件描述符注册事件如读、写、错误等和对应的socket描述符。 事件等待通过epoll_wait函数等待一个或多个事件的发生。这个调用是阻塞的直到至少有一个已注册的事件发生或者超时或者被中断。相比于select和pollepoll_wait的优势在于它不会随着监听的文件描述符数量增加而导致效率下降因为它内部维护了一个高效的红黑树结构来管理这些描述符。 事件处理当epoll_wait返回时会给出一个就绪事件的列表应用可以直接对这些事件进行处理而无需遍历所有监控的文件描述符。 水平触发和边缘触发 LT模式下只要事件未被处理每次调用epoll_wait都会返回该事件。ET模式下事件仅在状态发生变化的那一刻返回一次要求应用程序一次性处理完所有就绪的数据否则可能会丢失事件。 示例 void handlerClient(int clientFd) {std::string msg;if (not EchoServer::RecvMsg(clientFd, msg)) {return;}EchoServer::SendMsg(clientFd, msg); }int main(int argc, char *argv[]) {if (argc ! 3) {std::cout invalid input std::endl;std::cout example: ./Epoll 0.0.0.0 1688 std::endl;return -1;}int sockFd EchoServer::CreateListenSocket(argv[1], atoi(argv[2]), false);if (sockFd 0) {return -1;}epoll_event events[2048];int epollFd epoll_create(1024);if (epollFd 0) {perror(epoll_create failed);return -1;}EchoServer::Conn conn(sockFd, epollFd, false);EchoServer::SetNotBlock(sockFd);EchoServer::AddReadEvent(conn);while (true) {int num epoll_wait(epollFd, events, 2048, -1);if (num 0) {perror(epoll_wait failed);continue;}for (int i 0; i num; i) {EchoServer::Conn *conn (EchoServer::Conn *)events[i].data.ptr;if (conn-Fd() sockFd) {EchoServer::LoopAccept(sockFd, 2048, [epollFd](int clientFd) {EchoServer::Conn *conn new EchoServer::Conn(clientFd, epollFd, false);EchoServer::AddReadEvent(conn); // 监听可读事件保持fd为阻塞IOEchoServer::SetTimeOut(conn-Fd(), 0, 500000); // 设置读写超时时间为500ms});continue;}handlerClient(conn-Fd());EchoServer::ClearEvent(conn);delete conn;}}return 0; } 异步I/O
http://www.hkea.cn/news/14435044/

相关文章:

  • 做兼职一般去哪个网站好pyhton可以做网站吗
  • 做网站程序的都不关注seo安全生产门户网站建设
  • 自己做的网站怎么用qq登入国家企业信用网官网
  • 做ios试玩推广网站软件app开发公司电话
  • 商城网站建设的步骤济南的网站建设公司哪家好
  • 图网新网站排名优化
  • 车床加工东莞网站建设公关公司服务的特点
  • 网站开发要求有哪些界面设计规范
  • 关于书店电商网站建设的心得十堰做网站最好的公司
  • 天津网站制作推广不知情的情况下帮别人做网站他违法
  • 建站公司如何在抖音平台开店徐州社交网站
  • 电子商务网站建设策划书范文广州公司注册场地要求
  • 网站设计 版权嘉定网站设计制作优化排名
  • WordPress询盘seo网站内容优化
  • 个人网站备案容易吗做购物网站能否生存
  • 向国外支付网站开发费湖州站内优化seo公司
  • 怎么申请网站详细步骤什么是营销型网站设计
  • 网站开发分哪几个步骤wordpress PHP cpanel
  • 网站建设7大概要多久wordpress网站主修改密码
  • 中国建设银行官网网站平台交易
  • 接网站制作做网站买域名
  • 花生壳怎么做网站wordpress 调取菜单
  • 深圳宝安通网站建设线下教育机构
  • 莱芜手机网站建设报价新网站如何做推广软文
  • 网上做流量对网站有什么影响慧聪网郭凡生现状
  • 网站空间流量6g成都网站建设服务密需湖南岚鸿案例
  • 网站建设与设计毕业设计怎么建立自己的网站?
  • 汕头网络公司网站建设网站建设阶段推广策略
  • 网站基本功能门户网站系统程序
  • 网站开发流程图软件东莞计算机培训机构哪个最好