io模型:
同步io: 阻塞形式,非阻塞形式(輪詢)、訊號驅動io、io復用(select, poll, epoll);
非同步io:aio_read()
典型場景:
1、客戶端處理多種io-------標準io 和網路io(套接字)
2、server端既要處理監聽套接字又要處理已連線的套接字
3、乙個伺服器要處理tcp,又要處理udp
4、server端要處理多種服務多個協議;
5、不管是網路套接字還是檔案讀寫描述符均可處理;
1 #include 2 #include select.h>3 #include 4 #include 5 #include 6
7 #include in.h>
8 #include 9 #include //
bzero()
1011
intmain()
1225
*accept缺省會阻塞程序,直到有乙個客戶連線建立後返回,
26*它返回的是乙個新可用的套接字,這個套接字是連線套接字。
27*此時我們需要區分兩種套接字,一種套接字正如accept的引數sockfd,它是監聽套接字,
28*在呼叫listen函式之後,乙個套接字會從主動連線的套接字變身為乙個監聽套接字;
29*而accept返回是乙個連線套接字,它代表著乙個網路已經存在的點點連線。
30*在呼叫listen函式之後,乙個套接字會從主動連線的套接字變身為乙個監聽套接字;
31*而accept返回是乙個連線套接字,它代表著乙個網路已經存在的點點連線。
32*自然要問的是:為什麼要有兩種套接字?原因很簡單,如果使用乙個描述字的話,
33*那麼它的功能太多,使得使用很不直觀,同時在核心確實產生了乙個這樣的新的描述字.
34*/
35//
struct sockaddr_in serv_addr;
36//
address family, socket_stream, 0:會自動選擇type型別對應的預設協議
37 socketfd = socket(af_inet,sock_stream, 0
);38
if(socketfd)
4142 bzero((char*)&serv_addr, sizeof
(serv_addr));
43 serv_addr.sin_family = af_inet; //
主機位元組序
44 serv_addr.sin_port = htons(7777); //
網路位元組序
45 serv_addr.sin_addr.s_addr =htonl(inaddr_any); //
監聽所有位址
4647
if(bind(socketfd, (struct sockaddr*)&serv_addr, sizeof
(serv_addr)))
5051 listen(socketfd, 100
);52
53int
maxfd;
54fd_set allset, rset;
55 maxfd =socketfd;
5657 fd_zero(&allset); //
將allset清零,使得集合中不含任何fd
58 fd_set(socketfd, &allset); //
將socketfd加入allset集合
5960
intsockfd, clilen, bytes;
61struct
sockaddr_in cli_addr;
62char buffer[256
];63
64while(1)72
73for(i=0; i<=maxfd; i++)
81 fd_clr(i, &rset); //清零
82 maxfd = maxfd>sockfd?maxfd:sockfd;
83 fd_set(sockfd, &allset);
8485 }else
93 printf("
recv msg: %s
", buffer);
94 send(i, buffer, 255, 0
);95}96
}97}98
}99100return0;
101 }
linux select函式用法
select系統呼叫是用來讓我們的程式監視多個檔案控制代碼的狀態變化的。程式會停在select這裡等待,直到被監視的檔案控制代碼有乙個或多個發生了狀態改變。關於檔案控制代碼,其實就是乙個整數,我們最熟悉的控制代碼是0 1 2三個,0是標準輸入,1是標準輸出,2是標準錯誤輸出。0 1 2是整數表示的,...
linux select 系統呼叫
linux系統提供系統呼叫 select,它允許程式掛起,並等待從不止乙個檔案描述符的輸入。它的原理如下 獲得所需要的檔案描述符列表 將此描述符傳給 select select 掛起直到任何乙個檔案描述符有資料到達 select 設定乙個變數中的若干位,用來通知哪乙個檔案描述符已經有輸入的資料。se...
linux select 系統呼叫
select 系統呼叫允許程式同時在多個底層檔案描述符上等待輸入的到達 輸出的完成,或產生錯誤資訊。這意味著終端 程式可以一直阻塞到有事情可做為止。select 函式對資料結構 fd set 進行操作,它是由開啟的檔案描述符構成的集合。有一組定義好的巨集可以用來控制這些集合 include incl...