初始化過程:
除了可以采用多進程和多線程方法實現(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ū)中,
點擊(此處)折疊或打開
- #include "server.h"
 
 
- int main()
 
- {
 
-     int listen_fd, connect_fd, max_fd;
 
-     struct sockaddr_in serveraddr, clientaddr;
 
-     char buf[MAXBUF];
 
-     int length;
 
-     fd_set rdfs, tempfs;
 
-     int num;
 
 
 
-     listen_fd = socket(AF_INET, SOCK_STREAM, 0);
 
 
-     memset(&serveraddr, 0, sizeof(serveraddr));
 
-     serveraddr.sin_family = AF_INET;
 
-     serveraddr.sin_port = htons(8000);
 
-     serveraddr.sin_addr.s_addr = inet_addr("192.168.0.104");
 
 
-     bind(listen_fd, (SA *)&serveraddr, sizeof(serveraddr));
 
-     listen(listen_fd, 10);
 
-     //connect_fd = bind();
 
-     
 
-     memset(buf, '\0', sizeof(buf));
 
-     FD_ZERO(&rdfs);
 
-     FD_SET(0, &rdfs);
 
-     FD_SET(listen_fd, &rdfs);
 
-     max_fd = listen_fd;
 
-     
 
-     int i;
 
 
-     while(1)
 
-     {
 
-         tempfs = rdfs;
 
-         printf("selecting...\n");
 
 
-         if((num = select(max_fd + 1, &tempfs, NULL, NULL, NULL))== -1)
 
-         {
 
-             perror("select failed!\n");
 
-             exit(-1);
 
-         }
 
-         else if(num > 0)
 
-         {
 
-             printf("the current fd stream number is : %d\n" , num);
 
-         }
 
 
-         printf("select success...\n");
 
-     //    sleep(1);
 
-         
 
-         for(i=0; i< max_fd + 1; i++)
 
-         {
 
-             if(FD_ISSET(i, &tempfs))
 
-             {
 
-                 if(i == STDIN_FILENO)
 
-                 {
 
-                     fgets(buf, sizeof(buf), stdin);
 
-                     printf("input :%s",buf);
 
-                 }
 
 
-                 if(i == listen_fd)
 
-                 {
 
-                     length = sizeof(clientaddr);
 
-                     printf("connecting...");
 
-                     connect_fd = accept(listen_fd, (SA *)&clientaddr, &length);
 
-                     printf("connected!\n");
 
-                     FD_SET(connect_fd, &rdfs);
 
 
-                     if(max_fd < connect_fd)
 
-                     {
 
-                         max_fd = connect_fd;
 
-                     }
 
 
-                     printf("IP: %s port: %d\n", inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));
 
-                 }
 
-                 else
 
-                 {
 
-                     memset(buf, 0, sizeof(buf));
 
-                     read(i, buf, sizeof(buf));
 
-                     printf("Get Message:%s\n", buf);
 
-                     close(i);
 
-                     FD_CLR(i, &rdfs);
 
 
-                     if(max_fd == i)
 
-                     {
 
-                         max_fd --;
 
-                     }
 
-                 }
 
 
-             }
 
-         }
 
-     }
 
 
-     return 0;
 
- }

 
                         
                                
 
                                

 
                        

