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

做的比较好的旅行网站做电影网站需要的服务器配置

做的比较好的旅行网站,做电影网站需要的服务器配置,域名权重是什么意思,wordpress 取消分类目录select函数的用法和原理 Linux上的select函数 select函数用于检测一组socket中是否有事件就绪.这里的事件为以下三类: 读事件就绪 在socket内核中,接收缓冲区中的字节数大于或者等于低水位标记SO_RCVLOWAT,此时调用rec或read函数可以无阻塞的读取该文件描述符,并且返回值大于…select函数的用法和原理 Linux上的select函数 select函数用于检测一组socket中是否有事件就绪.这里的事件为以下三类: 读事件就绪 在socket内核中,接收缓冲区中的字节数大于或者等于低水位标记SO_RCVLOWAT,此时调用rec或read函数可以无阻塞的读取该文件描述符,并且返回值大于零TCP连接的对端关闭连接,此时本端调用rrecv或read函数对socket进行读操作,recv或read函数返回0在监听的socket上有新的连接请求在socket尚有未处理的错误 写事件就绪 在socket内核中,发送缓冲区中的可用字节数大于等于低水位标记时,可以无阻塞的写,并且返回值大于0socket的写操作被关闭时,对一个写操作被关闭的socket进行写操作,会触发SIGPIPE信号socket使用非阻塞connect连接成功或失败时 异常事件就绪 select()如下: #include sys/select.h int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);参数说明 nfds:Linux上的socket也叫作fd,将这个参数的值设置为所有需要使用select函数检测事件的fd中的最大值加1即nfdsmax(fd1,fd2,...,fdn)1readfds:需要监听可读事件的fd集合writefds:需要监听可写事件fd的集合exceptfds:需要监听异常事件的fd集合timeout:超时时间,即在这个参数设定的时间内检测这些fd的事件,超过这个时间后,select函数立即返回,这是一个timeval结构体 其定义如下: struct timeval{ long tv_sec; /*秒 */long tv_usec; /*微秒 */ }参数readfds,writefds,exceptfds的类型都是fd_set,这是一个结构体信息 定义如下 //#define __FD_SETSIZE 1024 #define __NFDBITS (8 * (int) sizeof (__fd_mask)) #define __FD_ELT(d) ((d) / __NFDBITS) #define __FD_MASK(d) ((__fd_mask) (1UL ((d) % __NFDBITS)))/* fd_set for select and pselect. */ typedef struct{/* XPG4.2 requires this member name. Otherwise avoid the namefrom the global namespace. */ #ifdef __USE_XOPEN//typedef long int __fd_mask;__fd_mask fds_bits[__FD_SETSIZE / __NFDBITS]; # define __FDS_BITS(set) ((set)-fds_bits) #endif} fd_set;/* 最大数量fd_set. */ #define FD_SETSIZE __FD_SETSIZE假设未定义__USE_XOPEN整理一年 typedef struct{ //typedef long int __fd_mask;long int fds_bits[__FD_SETSIZE / __NFDBITS];} fd_set;将一个fd添加到fd_set这个集合中时需要使用FD_SET宏,其定义如下: void FD_SET(fd, fdsetp)实现如下: #define FD_SET(fd, fdsetp) __FD_SET (fd, fdsetp)__FD_SET (fd, fdsetp)实现如下: /* We dont use memset because this would require a prototype andthe array isnt too big. */ # define __FD_ZERO(set) \do { \unsigned int __i; \fd_set *__arr (set); \for (__i 0; __i sizeof (fd_set) / sizeof (__fd_mask); __i) \__FDS_BITS (__arr)[__i] 0; \} while (0)#endif /* GNU CC */#define __FD_SET(d, set) \((void) (__FDS_BITS (set)[__FD_ELT (d)] | __FD_MASK (d)))举个例子,假设现在fd的值为43,那么在数组下表为0的元素中第43个bit被置为1 再Linux上,向fd_set集合中添加新的fd时,采用位图法确定位置;在windows中添加fd至fd_set的实现规则依次从数组第0个位置开始向后递增 也就是说,FD_SET宏本质上是在一个有1024个连续bit的数组的第fd位置置1. 同理,FD_CLR删除一个fd的原理,也就是将数组的第fd位置置为0 实例; #include sys/types.h #include sys/socket.h #include arpa/inet.h #include unistd.h #include iostream #include cstring #include sys/time.h #include vector #include cerrno//Customize the value representing invalid fd #pragma clang diagnostic push #pragma ide diagnostic ignored EndlessLoop #define INVALID_FD -1 int main(int argc,char * argv[]) {//create a listen socketint listenfd socket(AF_INET,SOCK_STREAM,0);if(listenfd INVALID_FD){printf(创建监听socket失败);return -1;}//init server addrsockaddr_in bindaddr{};bindaddr.sin_family AF_INET;bindaddr.sin_addr.s_addr htonl(INADDR_ANY);bindaddr.sin_port htons(3000);if(bind(listenfd,(struct sockaddr*) bindaddr, sizeof(bindaddr)) -1){printf(绑定socket失败);close(listenfd);return -1;}//start listenif(listen(listenfd,SOMAXCONN) -1){printf(监听失败);close(listenfd);return -1;}//Store the clients socket datastd::vectorint clientfds;int maxfd;while(true){fd_set readset;FD_ZERO(readset);FD_SET(listenfd,readset);maxfd listenfd;unsigned long clientfdslength clientfds.size();for (int i 0; i clientfdslength; i){if(clientfds[i] ! INVALID_FD){FD_SET(clientfds[i],readset);if(maxfdclientfds[i])maxfd clientfds[i];}}timeval tm{};tm.tv_sec 1;tm.tv_usec 0;int ret select(maxfd1,readset, nullptr, nullptr,tm);if(ret -1){if (errno ! EINTR)break;}//time outelse if (ret 0 ){continue;}else{//event detected on a socketif (FD_ISSET(listenfd,readset)){sockaddr_in clientaddr{};socklen_t clientaddrlen sizeof(clientaddr);//accept client connectionint clientfd accept(listenfd,(struct sockaddr *)clientaddr,clientaddrlen);if (clientfd INVALID_FD){break;}std::cout接受到客户端连接fdclientfdstd::endl;clientfds.push_back(clientfd);}else{//Assume that the data length sent by the client is not greater than 63char recvbuf[64];unsigned long clientfdslength clientfds.size();for (int i 0; i clientfdslength; i){if(clientfds[i] ! INVALID_FD FD_ISSET(clientfds[i],readset)){memset(recvbuf,0, sizeof(recvbuf));//accept dataint length recv(clientfds[i],recvbuf,64,0);//recv的返回值等于0,表示客户端关闭了连接if (length 0 ){//errorstd::couterrorclientfds[i]std::endl;close(clientfds[i]);clientfds[i] INVALID_FD;continue;}std::coutclientfd: clientfds[i], recv data:recvbufstd::endl;}}}}}//close all client socketint clientfdslength clientfds.size();for (int i 0; i clientfdslength; i){if(clientfds[i] ! INVALID_FD){close(clientfds[i]);}}//close socketclose(listenfd);return 0; } #pragma clang diagnostic pop使用nc -v 127.0.0.1 3000来模拟客户端,打开三个终端 关于以上代码,需要注意以下几点: select函数在调用前后可能会修改readfds,writefds,exceptfds所以想在下次调用select函数时服用这些fd_set变量需要重新清零,添加内容 for (int i 0; i clientfdslength; i){if(clientfds[i] ! INVALID_FD){FD_SET(clientfds[i],readset);if(maxfdclientfds[i])maxfd clientfds[i];}}select函数也会修改timeval结构体的值,如果想复用这些变量,需要重新设置 timeval tm{};tm.tv_sec 1;tm.tv_usec 0;如果将select的timeval参数设置为NULL,则select函数会一直阻塞下去 windows上的socket函数 在windows上,select函数结束后,不会修改timeval函数 TCP网络编程的基本流程 Linux与C11多线程编程(学习笔记) Linux select函数用法和原理 socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现) connect函数在阻塞和非阻塞模式下的行为 获取socket对应的接收缓冲区中的可读数据量
http://www.zqtcl.cn/news/999866/

相关文章:

  • 项目四网站建设内容开发公司岗位设置
  • 卫浴网站建设深圳龙华做网站的
  • 一个网站没有备案百度互联网营销顾问是做什么的
  • 个人网站建立策划书前言ps做的网站如何转入dw
  • 怎么样用自己电脑做网站做不做生意都要知道的网站
  • 成都网站推广创新互联做平面那个网站素材好
  • 河南建设厅深圳关键词优化报价
  • 甘肃省住房建设厅网站证书查询网络营销的常用策略
  • 自助建站基础工作主要包括()上海网站关键词排名
  • 中国住房和城乡建设部网站安全小明seo教程
  • 网站基本常识wordpress怎么使用插件
  • 无锡高端网站制作广州装修公司排名
  • 做h5商城网站pc网站建设哪
  • 顺企网萍乡网站建设自己如何开自己的商城
  • 怎样做当地网站推广平顶山车祸最新新闻事件
  • 重庆网站制作1000客户营销
  • 视频播放网站 模板潍坊网站建设首荐创美网络
  • 网站静态页面模板网页设计案例代码
  • 网站开发的ie兼容做到9网站开发具体问题
  • 企业建站业务还能做吗园林景观网站模板
  • 建筑招聘网站有哪些电商商城app制作开发
  • 做网站开发 用什么在进行网站设计时
  • 21dove谁做的的网站新媒体营销论文
  • 做电影网站配什么公众号网站新闻发布系统模板
  • 网站风格发展趋势wordpress悬浮音乐插件
  • 做网站前期费用新注册公司网站建设
  • 建站平台在线提交表格功能检测站点是否使用wordpress
  • 谁能做网站开发免费软件看电视剧
  • 深圳的网站建设网站建设网页设计做网站
  • 广州网站建设网页设计贵阳网站建设宏思锐达