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

  }

  }

  }

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

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

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

猜你喜欢

转载自blog.csdn.net/aa867734398/article/details/81488208