zoukankan      html  css  js  c++  java
  • linux 网络编程 3---(io多路复用,tcp并发)

    1,io模型:

      阻塞io、非阻塞io、io多路复用,信号驱动io。

    阻塞Io与非阻塞io的转换,可用fcntl()函数

      #include<unistd.h>

      #include<fcntl.h> 

     int fcntl(int fd,int cmd,...);

    2,io多路复用

      在应用程序中同时处理多路输入输出流

      若采用阻塞模式,将得不到预期的目的

       若采用非阻塞模式,对多个输入进行轮询,则浪费CPU资源

       若设置多个进程,分别处理一条数据通路,将新产生进程间的同步与通信问题

        使得程序变得过于复杂。

      这时,比较好的方法是使用IO多路复用,其基本思想是:

        先构造一张有关描述符的表,然后调用一个函数。

        当这些文件描述符中的一个或多个已准备好进行IO函数时,函数才返回

        函数返回时,高诉进程哪个描述符已经就绪,可以进行IO操作。

      使用IO多路复用时,主要用到以下函数(LINUX)

      int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set * exceptfds,struct timeval * timeout);

      void FD_ZERO(fd_set *set);

      void FD_SET(int fd,fd_set *set);

      void FD_CLR(int fd,fd_set *set);

      int FD_ISSET(int fd,fd_set *set);

    莫做伸手党。

    3,实现TCP并发服务器

      方法一:通过使用父子进程实现tcp并发服务器

      方法二:使用select函数实现tcp并发服务器

    法一:

      socket();

      sockaddr_in;

      bind();

      listen();

      while(1)

      {

      accept();

      pid = fork();

      if(pid > 0){}父进程负责连接

      else if(pid == 0){

      while(1)

      {

      recv()/send();

      }

      }

      }

      这里有个难点:一个客户端退出后,如何避免对应的“服务器”进程,编程僵尸进程?

            解决办法是:采用信号,来回收客户端对应“服务器的资源”。

      法二:笔者也在琢磨。。。。。。

  • 相关阅读:
    Java中的权限修饰符
    return,break,continue三者的区别
    JS代码放在不同位置的区别
    创建画笔工具
    关于SPH的核函数求导过程
    c++多级指针与“多维”数组 摘自别人博客
    RAP开发入门-搭建RAP开发环境(一)
    06 media媒体查询
    resolution 像素密度
    手动配置viewport-04
  • 原文地址:https://www.cnblogs.com/jiaan/p/9439312.html
Copyright © 2011-2022 走看看