• 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();

      }

      }

      }

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

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

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

  • 相关阅读:
    关于wangEditor粘贴图片自动上传
    关于xheditor粘贴图片自动上传
    SAS如何看待大数据
    SAS如何看待大数据
    大数据时代的电子商务​_数据分析师
    大数据时代的电子商务​_数据分析师
    Python 微信公众号文章爬取
    leetcode_445. 两数相加 II
    手把手教你用Gurobi求解一个数学模型
    Python 微信公众号文章爬取
  • 原文地址:https://www.cnblogs.com/jiaan/p/9439312.html
Copyright © 2020-2023  润新知