小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

IO多路復用

 jijo 2012-04-19


初始化過程:

關鍵:socket==>bind ==> listen;
定義listen_fd = socket(AF_INET, SOCK_STREAM, 0)
    配置socket套接字數(shù)據(jù)結構
    綁定地址:bind(listen_fd, (SA *)&serveraddr, sizeof(serveraddr));
    設置監(jiān)聽:listen(listen_fd, max_lsn);
創(chuàng)建一個循環(huán)監(jiān)視:
while(1)循環(huán)實現(xiàn):
1、設置讀寫文件描述符集合readfs;(初始化可設置一個標準輸入和監(jiān)聽文件描述符)
其余設置為空;由于每次進行一次操作,循環(huán)回來初始化到原來狀態(tài);
2、調(diào)用select;
遍歷當前所有存在的文件描述符;
if(i == listen_fd)//說明有新的連接請求,那么就建立連接
{  建立連接connect_fd == accept();然后將connect_fd 送進文件描集;}
else //說明其他操作針對的是已經(jīng)存在的文件描述符、讀、寫、發(fā)送、接受、
{ 進行默契的操作}//end while(1);

///多路復用特點和應用:

除了可以采用多進程和多線程方法實現(xiàn)并發(fā)服務器之外,還可以采用I/O多路復用技術。通過該技術,系統(tǒng)內(nèi)核緩沖I/O數(shù)據(jù),當某個I/O準備好后,系統(tǒng)通知應用程序該I/O可讀或可寫,這樣應用程序可以馬上完成相應的I/O操作,而不需要等待系統(tǒng)完成相應I/O操作,從而應用程序不必因等待I/O操作而阻塞。

與多進程和多線程技術相比,I/O多路復用技術的最大優(yōu)勢是系統(tǒng)開銷小,系統(tǒng)不必創(chuàng)建進程/線程,也不必維護這些進程/線程,從而大大減小了系統(tǒng)的開銷。

對于I/O復用典型的應用如下:

(1)當客戶處理多個描述字時(一般是交互式輸入和網(wǎng)絡套接口),必須使用I/O復用。

(2)當一個客戶同時處理多個套接口時,而這種情況是可能的,但很少出現(xiàn)。

(3)如果一個TCP服務器既要處理監(jiān)聽套接口,又要處理已連接套接口,一般也要用到I/O復用。

(4)如果一個服務器即要處理TCP,又要處理UDP,一般要使用I/O復用。

(5)如果一個服務器要處理多個服務或多個協(xié)議,一般要使用I/O復用。

I/O復用調(diào)用select()或poll()函數(shù),并在該函數(shù)上阻塞,等待數(shù)據(jù)報套接口可讀;當select()返回可讀條件時,調(diào)用recvfrom()將數(shù)據(jù)報拷貝到應用程序緩沖區(qū)中,


點擊(此處)折疊或打開

  1. #include "server.h"

  2. int main()
  3. {
  4.     int listen_fd, connect_fd, max_fd;
  5.     struct sockaddr_in serveraddr, clientaddr;
  6.     char buf[MAXBUF];
  7.     int length;
  8.     fd_set rdfs, tempfs;
  9.     int num;


  10.     listen_fd = socket(AF_INET, SOCK_STREAM, 0);

  11.     memset(&serveraddr, 0, sizeof(serveraddr));
  12.     serveraddr.sin_family = AF_INET;
  13.     serveraddr.sin_port = htons(8000);
  14.     serveraddr.sin_addr.s_addr = inet_addr("192.168.0.104");

  15.     bind(listen_fd, (SA *)&serveraddr, sizeof(serveraddr));
  16.     listen(listen_fd, 10);
  17.     //connect_fd = bind();
  18.     
  19.     memset(buf, '\0', sizeof(buf));
  20.     FD_ZERO(&rdfs);
  21.     FD_SET(0, &rdfs);
  22.     FD_SET(listen_fd, &rdfs);
  23.     max_fd = listen_fd;
  24.     
  25.     int i;

  26.     while(1)
  27.     {
  28.         tempfs = rdfs;
  29.         printf("selecting...\n");

  30.         if((num = select(max_fd + 1, &tempfs, NULL, NULL, NULL))== -1)
  31.         {
  32.             perror("select failed!\n");
  33.             exit(-1);
  34.         }
  35.         else if(num > 0)
  36.         {
  37.             printf("the current fd stream number is : %d\n" , num);
  38.         }

  39.         printf("select success...\n");
  40.     //    sleep(1);
  41.         
  42.         for(i=0; i< max_fd + 1; i++)
  43.         {
  44.             if(FD_ISSET(i, &tempfs))
  45.             {
  46.                 if(i == STDIN_FILENO)
  47.                 {
  48.                     fgets(buf, sizeof(buf), stdin);
  49.                     printf("input :%s",buf);
  50.                 }

  51.                 if(i == listen_fd)
  52.                 {
  53.                     length = sizeof(clientaddr);
  54.                     printf("connecting...");
  55.                     connect_fd = accept(listen_fd, (SA *)&clientaddr, &length);
  56.                     printf("connected!\n");
  57.                     FD_SET(connect_fd, &rdfs);

  58.                     if(max_fd < connect_fd)
  59.                     {
  60.                         max_fd = connect_fd;
  61.                     }

  62.                     printf("IP: %s port: %d\n", inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));
  63.                 }
  64.                 else
  65.                 {
  66.                     memset(buf, 0, sizeof(buf));
  67.                     read(i, buf, sizeof(buf));
  68.                     printf("Get Message:%s\n", buf);
  69.                     close(i);
  70.                     FD_CLR(i, &rdfs);

  71.                     if(max_fd == i)
  72.                     {
  73.                         max_fd --;
  74.                     }
  75.                 }

  76.             }
  77.         }
  78.     }

  79.     return 0;
  80. }

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多