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

推广你公司网站攀枝花建设规划网站

推广你公司网站,攀枝花建设规划网站,社交模板网站建设,如何禁用wordpress播放器10.3 网络高级编程在实际情况中#xff0c;人们往往遇到多个客户端连接服务器端的情况。由于之前介绍的如connet()、recv()和send()等都是阻塞性函数#xff0c;如果资源没有准备好#xff0c;则调用该函数的进程将进入睡眠状态#xff0c;这样就无法处理I/O多路复用的情况…10.3  网络高级编程在实际情况中人们往往遇到多个客户端连接服务器端的情况。由于之前介绍的如connet()、recv()和send()等都是阻塞性函数如果资源没有准备好则调用该函数的进程将进入睡眠状态这样就无法处理I/O多路复用的情况了。本节给出了两种解决I/O多路复用的解决方法这两个函数都是之前学过的fcntl()和select()(请读者先复习第6章中的相关内容)。可以看到由于在Linux中把socket也作为一种特殊文件描述符这给用户的处理带来了很大的方便。1fcntl()函数fcntl()针对socket编程提供了如下的编程特性。n 非阻塞I/O可将cmd设置为F_SETFL将lock设置为O_NONBLOCK。n 异步I/O可将cmd设置为F_SETFL将lock设置为O_ASYNC。下面是用fcntl()将套接字设置为非阻塞I/O的实例代码/* net_fcntl.c */#include #include #include #include #include #include #include #include #include #include #include #include #include #define PORT                  1234#define MAX_QUE_CONN_NM        5#define BUFFER_SIZE             1024int main(){struct sockaddr_in server_sockaddr, client_sockaddr;int sin_size, recvbytes, flags;int sockfd, client_fd;char buf[BUFFER_SIZE];if ((sockfd  socket(AF_INET, SOCK_STREAM, 0))  -1){perror(socket);exit(1);}server_sockaddr.sin_family  AF_INET;server_sockaddr.sin_port  htons(PORT);server_sockaddr.sin_addr.s_addr  INADDR_ANY;bzero((server_sockaddr.sin_zero), 8);int i  1;/* 允许重复使用本地地址与套接字进行绑定 */setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, i, sizeof(i));if (bind(sockfd, (struct sockaddr *)server_sockaddr,sizeof(struct sockaddr))  -1){perror(bind);exit(1);}if(listen(sockfd,MAX_QUE_CONN_NM)  -1){perror(listen);exit(1);}printf(Listening....\n);/* 调用fcntl()函数给套接字设置非阻塞属性 */flags  fcntl(sockfd, F_GETFL);if (flags {perror(fcntl);exit(1);}while(1){sin_size  sizeof(struct sockaddr_in);if ((client_fd  accept(sockfd,(struct sockaddr*)client_sockaddr, sin_size)) {perror(accept);exit(1);}if ((recvbytes  recv(client_fd, buf, BUFFER_SIZE, 0)) {perror(recv);exit(1);}printf(Received a message: %s\n, buf);} /*while*/close(client_fd);exit(1);}运行该程序结果如下所示$ ./net_fcntlListening....accept: Resource temporarily unavailable可以看到当accept()的资源不可用(没有任何未处理的等待连接的请求)时程序就会自动返回。2select()使用fcntl()函数虽然可以实现非阻塞I/O或信号驱动I/O但在实际使用时往往会对资源是否准备完毕进行循环测试这样就大大增加了不必要的CPU资源的占用。在这里可以使用select()函数来解决这个问题同时使用select()函数还可以设置等待的时间可以说功能更加强大。下面是使用select()函数的服务器端源代码。客户端程序基本上与10.2.3小节中的例子相同仅加入一行sleep()函数使得客户端进程等待几秒钟才结束。/* net_select.c */#include #include #include #include #include #include #include #include #include #define PORT                 4321#define MAX_QUE_CONN_NM       5#define MAX_SOCK_FD            FD_SETSIZE#define BUFFER_SIZE            1024int main(){struct sockaddr_in server_sockaddr, client_sockaddr;int sin_size, count;fd_set inset, tmp_inset;int sockfd, client_fd, fd;char buf[BUFFER_SIZE];if ((sockfd  socket(AF_INET, SOCK_STREAM, 0))  -1){perror(socket);exit(1);}server_sockaddr.sin_family  AF_INET;server_sockaddr.sin_port  htons(PORT);server_sockaddr.sin_addr.s_addr  INADDR_ANY;bzero((server_sockaddr.sin_zero), 8);int i  1;/* 允许重复使用本地地址与套接字进行绑定 */setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, i, sizeof(i));if (bind(sockfd, (struct sockaddr *)server_sockaddr,sizeof(struct sockaddr))  -1){perror(bind);exit(1);}if(listen(sockfd, MAX_QUE_CONN_NM)  -1){perror(listen);exit(1);}printf(listening....\n);/*将调用socket()函数的描述符作为文件描述符*/FD_ZERO(inset);FD_SET(sockfd, inset);while(1){tmp_inset  inset;sin_sizesizeof(struct sockaddr_in);memset(buf, 0, sizeof(buf));/*调用select()函数*/if (!(select(MAX_SOCK_FD, tmp_inset, NULL, NULL, NULL)  0)){perror(select);}for (fd  0; fd {if (FD_ISSET(fd, tmp_inset)  0){if (fd  sockfd){ /* 服务端接收客户端的连接请求 */if ((client_fd  accept(sockfd,(struct sockaddr *)client_sockaddr, sin_size)) -1){perror(accept);exit(1);}FD_SET(client_fd, inset);printf(New connection from %d(socket)\n, client_fd);}else /* 处理从客户端发来的消息 */{if ((count  recv(client_fd, buf, BUFFER_SIZE, 0))  0){printf(Received a message from %d: %s\n,client_fd, buf);}else{close(fd);FD_CLR(fd, inset);printf(Client %d(socket) has left\n, fd);}}} /* end of if FD_ISSET*/} /* end of for fd*/} /* end if while while*/close(sockfd);exit(0);}运行该程序时可以先启动服务器端再反复运行客户端程序(这里启动两个客户端进程)即可服务器端运行结果如下所示$ ./serverlistening....New connection from 4(socket)                 /* 接受第一个客户端的连接请求*/Received a message from 4: Hello,First!    /* 接收第一个客户端发送的数据*/New connection from 5(socket)              /* 接受第二个客户端的连接请求*/Received a message from 5: Hello,Second!   /* 接收第二个客户端发送的数据*/Client 4(socket) has left                   /* 检测到第一个客户端离线了*/Client 5(socket) has left                   /* 检测到第二个客户端离线了*/$ ./client localhost Hello,First!  ./client localhost Hello,Second
http://www.pierceye.com/news/82983/

相关文章:

  • 如何将自己做的网站变成中文wordpress做教育网站
  • 进度跟踪网站开发中企动力网站策划
  • 太原市住房和城乡建设厅网站互联网创业有哪些项目可以做
  • wordpress个人网站主题效果图在线网
  • 汽车用品网站wordpress资讯主题免费
  • 网站建设全部流程图做自媒体必备的8个网站
  • 备案可以不关闭网站吗深圳做网站一个月多少钱
  • 做技术分享网站 盈利前端编程工程师培训
  • 长宁区网站制东莞大岭山有什么好玩的地方
  • 公路建设管理办公室网站电商网站开发参考文献
  • 网站建设数据库建设如何在网站上做qq群链接
  • 潍坊知名网站建设价格低wordpress小论坛
  • 兰溪优秀高端网站设计秀山县公共资源交易中心
  • 网站建设实际总结自己怎么建设收费电影网站
  • 网站有做货手机网站开发合同
  • 毕节做网站网站制作案例市场
  • 做学校网站素材图片创意广告图片及文字解析
  • 网站设计作品案例接网站制作
  • 做网站不搭建本地环境常州网架生产厂家
  • 成都项目网站建设东莞seo排名外包
  • 做外贸生意用哪个网站最好wordpress 添加设置方法
  • 网站建设流程图片如何优化网站图片大小
  • 网站导读怎么做用手机做网站的流程
  • 大型的seo公司惠州seo按天付费
  • 南京市建设局网站设计师培训资料
  • 安丘市建设局网站网站标题修改
  • 宽屏蓝色企业网站源码章丘营销型网站设计公司
  • 网络用户提要求找人帮忙做的网站大连城建设计研究院网站
  • 做网站需要源码服务器机柜
  • 商城网站开发流程网页升级在线观看