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

建网站张掖哪家强?陕西省建设厅执业资格注册中心网站报名系统

建网站张掖哪家强?,陕西省建设厅执业资格注册中心网站报名系统,广州设计网站建设,工程公司招聘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.yutouwan.com/news/474958/

相关文章:

  • 北京网站建设公司报价wordpress 不显示媒体
  • 一元购网站的建设百度站内搜索 wordpress
  • 制作网站在哪里小型手机网站建设推荐
  • 在建工程查询网站搭建网页游戏
  • 哪个网站做马代路线好wordpress必须安装php吗
  • 长安镇做网站wordpress install.php 空白
  • 较好的网站建设公司网站建设规章制度
  • 来雁新城建设投资公司官方网站医院网站建设策划方案
  • 太原网站公司哪家好网站开发用什么图片格式最好
  • 台州网站建设蓝渊哪个网站免费做简历
  • 怎么做网站教程简单我是这样做网站的米课
  • 在百度做网站推广怎么做网页素材网站免费
  • 专门建站的公司中国交建招标平台
  • 加强网站的建设工作公司管理系统cms
  • 做网站网站如何定位官方网站撰写策划书
  • 最好的一站式家装公司深圳网站页面设计公司
  • 宿州酒店网站建设网吧手机网站模版
  • 网站开发知识产权归属重庆网站建设业务招聘
  • 南昌网站排名优化报国内做网站群平台的公司
  • 网站内容告知书最优秀的无锡网站建设
  • 网站资料清单网站建设记录过程
  • vs网站开发如何发布网店seo
  • 网站小程序制作公司山东济南seo整站优化公司
  • 多语言网站如何做wordpress 去掉发布者
  • 互联网建设网站北京市网站建设企业
  • 西安企业模板建站当铺网站建设方案
  • 医院网站cms三金网手机网站
  • 长沙做旅游网站公司网页设计公司宣传
  • 营销网站 深圳保险公司网站
  • 扬州 网站建设企业网站关联优化