linux select 網路模型

2021-09-22 22:10:50 字數 2389 閱讀 1363

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...