opencart做网站视频小程序开发需要多少钱知乎

pingmian/2026/1/20 10:06:41/文章来源:
opencart做网站视频,小程序开发需要多少钱知乎,东莞网站建设设,app是什么公司IO多路复用机制select实现TCP服务器 一、前言二、新增使用API函数2.1、select()函数2.2、FD_*系列函数 三、实现步骤四、完整代码五、TCP客户端5.1、自己实现一个TCP客户端5.2、Windows下可以使用NetAssist的网络助手工具 小结 一、前言 手把手教你从0开始编写TCP服务器程序体验开局一块砖大厦全靠垒。 为了避免篇幅过长使读者感到乏味对【TCP服务器的开发】进行分阶段实现一步步进行优化升级。 本节在上一章节的基础上将并发的实现改为IO多路复用机制使用select管理每个新接入的客户端连接实现发送和接收。 二、新增使用API函数 2.1、select()函数 函数原型 #include sys/types.h #include unistd.hint select(int maxfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);select函数共有5个参数其中参数 maxfds监视对象文件描述符数量。readset将所有关注“是否存在待读取数据”的文件描述符注册到fd_set变量并传递其地址值。writeset 将所有关注“是否可传输无阻塞数据”的文件描述符注册到fd_set变量并传递其地址值。exceptset将所有关注“是否发生异常”的文件描述符注册到fd_set变量并传递其地址值。timeout调用select后为防止陷入无限阻塞状态传递超时信息。 返回值 错误返回-1。超时返回0。 当关注的事件返回时返回大于0的值该值是发生事件的文件描述符数。 2.2、FD_*系列函数 函数原型 #include sys/types.h #include unistd.hvoid FD_CLR(int fd, fd_set *set); int FD_ISSET(int fd, fd_set *set); void FD_SET(int fd, fd_set *set); void FD_ZERO(fd_set *set);1FD_CLR函数用于将fd从set集合中清除即不监控该fd的事件。 2FD_SET函数用于将fd添加到set集合中监控其事件。 3FD_ZERO函数用于将set集合重置。 4FD_ISSET函数用于判断set集合中的fd是否有事件读、写、错误。 三、实现步骤 什么是IO多路复用通俗的讲就是一个线程通过记录IO流的状态来管理多个IO。解决创建多个进程处理IO流导致CPU占用率高的问题。 select是io多路复用的一种方式其他的还有poll、epoll等。 1创建socket。 int listenfdsocket(AF_INET,SOCK_STREAM,0); if(listenfd-1){printf(errno %d, %s\n,errno,strerror(errno));return SOCKET_CREATE_FAILED; }2绑定地址。 struct sockaddr_in server; memset(server,0,sizeof(server));server.sin_familyAF_INET; server.sin_addr.s_addrhtonl(INADDR_ANY); server.sin_porthtons(LISTEN_PORT);if(-1bind(listenfd,(struct sockaddr*)server,sizeof(server))){printf(errno %d, %s\n,errno,strerror(errno));close(listenfd);return SOCKET_BIND_FAILED; }3设置监听。 if(-1listen(listenfd,BLOCK_SIZE)){printf(errno %d, %s\n,errno,strerror(errno));close(listenfd);return SOCKET_LISTEN_FAILED; }4初始化可读文件描述符集合将监听套接字加入集合。 fd_set writefds,readfds,wset,rset; FD_ZERO(readfds); FD_ZERO(writefds); FD_SET(listenfd,readfds);5从可读文件描述符集合中选择一个就绪的套接字。 wsetwritefds; rsetreadfds;// 从可读文件描述符集合中选择就绪的套接字 int nreadyselect(maxfd1,rset,wset,NULL,NULL);if(nready-1) {printf(select errno %d, %s\n,errno,strerror(errno));continue; }6如果监听套接字有新连接请求处理新连接。 struct sockaddr_in client; memset(client,0,sizeof(client)); socklen_t lensizeof(client);int clientfdaccept(listenfd,(struct sockaddr*)client,len); if(clientfd-1){printf(accept errno %d, %s\n,errno,strerror(errno)); } else{printf(accept successdul, clientfd %d\n,clientfd);// 将新套接字加入可读文件描述符集合FD_SET(clientfd,readfds);if(clientfdmaxfd)maxfdclientfd; }7处理客户端发来的数据和发送数据到客户端。 int i0;for(ilistenfd1;imaxfd;i){if(FD_ISSET(i,rset)){printf(recv fd%d\n,i);retrecv(i,buf,BUFFER_LENGTH,0);if(ret0) {// 客户端断开连接printf(connection dropped\n);// 从可读文件描述符集合中移除该套接字FD_CLR(i,readfds);close(i);}else if(ret0){printf(fd%d recv -- %s\n,i,buf);FD_CLR(i,readfds);FD_SET(i,writefds);}}else if(FD_ISSET(i,wset)){printf(send to fd%d\n,i);retsend(i,buf,ret,0);if(ret-1){printf(send() errno %d, %s\n,errno,strerror(errno));}FD_CLR(i,writefds);FD_SET(i,readfds);}}四、完整代码 #include stdio.h #include sys/socket.h #include sys/types.h #include netinet/in.h#include errno.h #include string.h #include unistd.h#include sys/select.h#define LISTEN_PORT 9999 #define BLOCK_SIZE 10 #define BUFFER_LENGTH 1024enum ERROR_CODE{SOCKET_CREATE_FAILED-1,SOCKET_BIND_FAILED-2,SOCKET_LISTEN_FAILED-3,SOCKET_ACCEPT_FAILED-4,SOCKET_SELECT_FAILED-5 };int main(int argc,char **argv) {// 1.int listenfdsocket(AF_INET,SOCK_STREAM,0);if(listenfd-1){printf(errno %d, %s\n,errno,strerror(errno));return SOCKET_CREATE_FAILED;}// 2.struct sockaddr_in server;memset(server,0,sizeof(server));server.sin_familyAF_INET;server.sin_addr.s_addrhtonl(INADDR_ANY);server.sin_porthtons(LISTEN_PORT);if(-1bind(listenfd,(struct sockaddr*)server,sizeof(server))){printf(errno %d, %s\n,errno,strerror(errno));close(listenfd);return SOCKET_BIND_FAILED;}// 3.if(-1listen(listenfd,BLOCK_SIZE)){printf(errno %d, %s\n,errno,strerror(errno));close(listenfd);return SOCKET_LISTEN_FAILED;}printf(listen port: %d\n,LISTEN_PORT);fd_set writefds,readfds,wset,rset;FD_ZERO(readfds);FD_ZERO(writefds);FD_SET(listenfd,readfds);char buf[BUFFER_LENGTH]{0};int ret0;int maxfdlistenfd;while(1){wsetwritefds;rsetreadfds;// 从可读文件描述符集合中选择就绪的套接字int nreadyselect(maxfd1,rset,wset,NULL,NULL);if(nready-1){printf(select errno %d, %s\n,errno,strerror(errno));continue;}// 如果监听套接字有新连接请求处理新连接if(FD_ISSET(listenfd,rset)){// 4.printf(accept , listenfd %d\n,listenfd);struct sockaddr_in client;memset(client,0,sizeof(client));socklen_t lensizeof(client);int clientfdaccept(listenfd,(struct sockaddr*)client,len);if(clientfd-1){printf(accept errno %d, %s\n,errno,strerror(errno));}else{printf(accept successdul, clientfd %d\n,clientfd);// 将新套接字加入可读文件描述符集合FD_SET(clientfd,readfds);if(clientfdmaxfd)maxfdclientfd;}}printf(listenfd%d.maxfd%d\n,listenfd,maxfd);int i0;for(ilistenfd1;imaxfd;i){if(FD_ISSET(i,rset)){printf(recv fd%d\n,i);retrecv(i,buf,BUFFER_LENGTH,0);if(ret0) {// 客户端断开连接printf(connection dropped\n);// 从可读文件描述符集合中移除该套接字FD_CLR(i,readfds);close(i);}else if(ret0){printf(fd%d recv -- %s\n,i,buf);FD_CLR(i,readfds);FD_SET(i,writefds);}}else if(FD_ISSET(i,wset)){printf(send to fd%d\n,i);retsend(i,buf,ret,0);if(ret-1){printf(send() errno %d, %s\n,errno,strerror(errno));}FD_CLR(i,writefds);FD_SET(i,readfds);}}}close(listenfd);return 0; }编译命令 gcc -o server server.c五、TCP客户端 5.1、自己实现一个TCP客户端 自己实现一个TCP客户端连接TCP服务器的代码 #include stdio.h #include sys/socket.h#include netinet/in.h #include arpa/inet.h#include errno.h #include string.h#include unistd.h #include stdlib.h#define BUFFER_LENGTH 1024enum ERROR_CODE{SOCKET_CREATE_FAILED-1,SOCKET_CONN_FAILED-2,SOCKET_LISTEN_FAILED-3,SOCKET_ACCEPT_FAILED-4 };int main(int argc,char** argv) {if(argc3){printf(Please enter the server IP and port.);return 0;}printf(connect to %s, port%s\n,argv[1],argv[2]);int connfdsocket(AF_INET,SOCK_STREAM,0);if(connfd-1){printf(errno %d, %s\n,errno,strerror(errno));return SOCKET_CREATE_FAILED;}struct sockaddr_in serv;serv.sin_familyAF_INET;serv.sin_addr.s_addrinet_addr(argv[1]);serv.sin_porthtons(atoi(argv[2]));socklen_t lensizeof(serv);int rwfdconnect(connfd,(struct sockaddr*)serv,len);if(rwfd-1){printf(errno %d, %s\n,errno,strerror(errno));close(rwfd);return SOCKET_CONN_FAILED;}int ret1;while(ret0){char buf[BUFFER_LENGTH]{0};printf(Please enter the string to send:\n);scanf(%s,buf);send(connfd,buf,strlen(buf),0);memset(buf,0,BUFFER_LENGTH);printf(recv:\n);retrecv(connfd,buf,BUFFER_LENGTH,0);printf(%s\n,buf);}close(rwfd);return 0; }编译 gcc -o client client.c5.2、Windows下可以使用NetAssist的网络助手工具 下载地址http://old.tpyboard.com/downloads/NetAssist.exe 小结 至此我们实现了一个使用IO多路复用机制实现的服务器这时的TCP服务器可以使用一个线程就能处理多个客户端连接。通过记录IO流的状态来管理多个IO解决创建多个进程处理IO流导致CPU占用率高的问题。 我们总结一下select的使用流程 1、定义io管理状态变量fd_set rfds,wfds; 2、初始化变量FD_ZERO(); 3、设置io流状态最初只有监听的fd,将其设置FD_SET(listenfd,rfds); 4、在循环中select。 5、FD_ISSET()判断端口是否有连接。 6、FD_ISSET()判断可读、可写状态。 select是io多路复用的一种方式其他的还有poll、epoll等。下一章节我们将使用更高效的IO多路复用器epoll来实现TCP服务器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/87549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自助建站竹子青羊网站建设

“嵌段共聚醚酯型”易去污整理剂的结构特点及对织物服用性的影响? 收集资料阶段 嵌段共聚醚酯型易去污整理剂(简称聚醚酯)是涤纶最早的一种耐久性易去污剂,其商品名称为Permalose T,由英国ICI公司生产,它能使涤纶及其混纺织物具有优良的易去污、抗湿再沾污和抗静电性能。…

php设计网站建设西安seo代理计费

目录 一、概述 二、说明 三、功能说明 3.1 协调算法 3.2 操作模式 3.2.1 网络模式

济宁北湖旅游度假区建设局网站百度竞价推广代运营公司

我们应该感谢命运的多喘,是它用历练使一颗脆弱心的渐渐变得坚强,变得对一切都充满了向往。无可否认,只有真正的经历了一些事物之后,你才会对人生看得更加透彻,才会对世间真情感悟的更加真切。 1、个人只能被现实改变…

兰州网站定制公司怎样开电商平台

经常接触Python的同学可能会注意到,当需要安装第三方python包时,可能会用到easy_install命令。easy_install是由PEAK(Python Enterprise Application Kit)开发的setuptools包里带的一个命令,它用来安装egg包。egg包是目前最流行的python应用打…

怎么样做搜索引擎网站台州外贸网站建设

【摘要】通过本次课程可以让python学员了解一下python查询价格方法,对代码编程有个感性的认知。也好让大家能够理性选择,不要盲目跟从,选择适合自己当前阶段的学习内容,循序渐进,以兴趣自我探索为向导,所以…

网站做导航条可以发描文本的网站

今天某乎收到个问题推荐,如何实现RTSP回调YUV数据,用于二次处理? 正好前些年我们做RTSP和RTMP直播播放的时候,实现过相关的需求,本文就以Android为例,大概说说具体实现吧。 先说回调yuv或rgb这块意义吧&a…

马鞍山建设局网站涿州网站建设公司有哪些

牛客题霸 [求平方根] C题解/答案 题目描述 实现函数 int sqrt(int x). 计算并返回x的平方根 题解&#xff1a; 要求返回平方根&#xff0c;我们就找一个i&#xff0c;使得ii<x&&(i1)(i1)>x 这样的i就是我们要找的答案 注意&#xff0c;x有可能为负数&#xf…

河南郑州app建设网站西安企业名录

首先如果想直接在宿主机上进行使用gs_dump备份需要glibc的版本到2.34及以上&#xff0c;查看版本命令为 ldd --version 如图所示&#xff0c;本宿主机并不满足要求&#xff0c;所以转向在docker容器中进行备份&#xff0c; 然后进入opengauss容器中&#xff0c;命令为 docker…

网站类型定位分析网站关键词在哪里修改

前言 在上一篇文章中&#xff0c;我们学习了如何利用MetaGPT框架构建单智能体和多智能体&#xff0c;并通过一个技术文档撰写Agent和课后作业较为完整的理解一个Agent的需求分析和开发流程&#xff1b;但是技术要和应用结合才能得到更广泛的推广&#xff1b;在本文中&#xff0…

嘉兴手机模板建站wordpress博客破解主题

2023年已经接近尾声&#xff0c;不少人已经开始期待新的一年到来了。不过对于大多数职场人士来说&#xff0c;最近还有一项让人头疼的任务需要完成&#xff0c;这就是撰写2023年个人工作总结。 那么年度个人工作总结怎么写呢&#xff1f;其实很简单&#xff0c;年度工作总结一…

做网站哪个好自己做个购物网站

我的第一道treap题目&#xff0c;treap的模版题。 代码是对着hzw的敲的&#xff0c;一边敲一边理解。。。 主要是熟悉一下treap的各种基本操作&#xff0c;详细细节看代码。 #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib>…

网站策划主题北京海淀区公司

为什么要在seafile搞webdavSeafile 一直是一款可靠的文件同步web应用&#xff0c;经过个人测试&#xff0c;同一台机器上&#xff0c;seafile在传输文件时的速度比nextcloud要快&#xff08;可能也与php的设置有关系&#xff09;&#xff0c;这是seafile的优势。但是&#xff0…

建设个人网站用什么软件wordpress禁用主题更新

在我们做项目的时候TP的系统函数或系统类库满足不了我们的需要 所以有些东西需要我们自己去定义&#xff0c;在TP中我们怎么使用自己的函数库和类库呢&#xff1f;在TP系统中提供了三个系统函数库 common.php是全局必须加载的基础函数库&#xff0c;在任何时候都可以直接调用&a…

html5 3d网站网站申请备案成功后怎么建设

最近一直在整理单目测距的内容&#xff0c;想着检测单目测距都写完了&#xff0c;顺手也写个检测跟踪单目测距&#xff0c;算是总结下这部分内容吧&#xff0c;如果有错误&#xff0c;还请不吝赐教&#xff01;&#xff01; 参考文献: YOLOv5DeepSort实现目标跟踪 pytorch yolo…

深圳网站建设网站设计软文推广辽宁省建设银行网站

本文主要给大家分享一个实战项目&#xff0c;通过python代码写一款我们儿时大多数人玩过的游戏---小弹球游戏。只不过当时&#xff0c;我们是在游戏机上玩&#xff0c;现在我们通过运行代码来玩&#xff0c;看看大家是否有不一样的体验&#xff0c;是否可以重温当年的乐趣呢&am…

郑州虚拟货币网站开发wordpress模板+免费下载

阿里妹导读&#xff1a;好的开始是成功的一半&#xff01;工作中&#xff0c;目标的设置是最不能马虎的事情。今天&#xff0c;我们请来孙阳&#xff08;阿里巴巴测试开发专家&#xff09;&#xff0c;他从11年入职至今已有8年。在测试技术目标的KPI设置上&#xff0c;他有一些…

如何写手机适配网站网站全屏视频怎么做

作者&#xff1a;白狼 出处&#xff1a;http://www.manks.top/document/yii2-blog-manage.html 本文版权归作者&#xff0c;欢迎转载&#xff0c;但未经作者同意必须保留此段声明&#xff0c;且在文章页面明显位置给出原文连接&#xff0c;否则保留追究法律责任的权利。相信看了…

网站建设职责要求在线推广

阿丹&#xff1a; 在业务逻辑中的数据存在一部分业务场景&#xff0c;在导出文件或者视频的时候需要将文件暂存在服务器上再上传到oss对象存储或者fastdfs中让用户来下载使用。但是出现的问题就是如果目标文件过大&#xff0c;文件的上传云端和下载本地就会时间拉长&#xff0c…

专业网站设计的网站站长工具 seo综合查询

&#x1f388; 算法并不一定都是很难的题目&#xff0c;也有很多只是一些代码技巧&#xff0c;多进行一些算法题目的练习&#xff0c;可以帮助我们开阔解题思路&#xff0c;提升我们的逻辑思维能力&#xff0c;也可以将一些算法思维结合到业务代码的编写思考中。简而言之&#…

种子搜索网站开发万维网 网站到期

简介&#xff1a; 随着互联网技术的日渐发展、数据规模的扩大与复杂的需求场景的产生&#xff0c;传统的大数据架构无法承载。 作者 | 志羽 来源 | 阿里技术公众号 一 前言 传统的大数据技术起源于 Google 三架马车 GFS、MapReduce、Bigtable&#xff0c;以及其衍生的开源分布…