Posted on 2013-10-31 00:32
whspecial 閱讀(2728)
評論(1) 編輯 收藏 引用 所屬分類:
linux編程
這一段在看《unix網絡編程》,回顧之前做項目用到的一些東西,在這里總結一下:
(1)TCP套接口編程 這里介紹各個接口函數:
1 文件描述符 -socket(int domain, int type, int protocol); //生成文件描述符 -bind(int sockfd, struct sockaddr *my_addr, int addrlen); //將本地的一個端口綁定到fd上,一般只需要在server端 2 服務端 -listen(int sockfd, int backlog); //有兩個作用:1,將主動套接口變為被動套接口;2,設置最大連接數backlog -accept(int sockfd, void *addr, int *addrlen); //為建立好的連接生成一個新的fd 3 客戶端 -connect(int sockfd, struct sockaddr *serv_addr, int addrlen); //進行socket連接 4 通信 -send(int sockfd, const void *msg, int len, unsigned int flags); //發送請求 -recv(int sockfd, void *buf, int len, unsigned int flags); //接收請求
(2)I/O多路復用 I/O多路復用是指內核一旦發現進程指定的一個或者多個IO條件準備讀取,它就通知該進程。按照《UNIX網絡編程》的說法,I/O多路復用用于以下三種情況:
a)一個TCP服務器既要處理監聽套接口,又要處理已連接套接口;
b)一個服務器既要處理TCP,又要處理UDP;
c)當客戶端處理多個描述字(比如處理交互式輸入和網絡套接口)
目前被廣泛使用的是select和epoll:
2.1,select
int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)
第一個參數指定最大的fd數目,中間三個分別是被監控的讀、寫、異常的fd集,最后一個是超時時間。select函數會阻塞等待,直到監控的fd集中有fd就緒,或者已經超時。
2.2,epoll
epoll相比于select,主要的好處在于它不像select一樣去輪詢fd集,而是由內核去觸發;另外它支持更大的fd個數
(3)網絡服務器模型 其實網絡服務器模型還是比較復雜的,有一篇比較經典的文章叫做c10K problem,鏈接如下:
http://www.kegel.com/c10k.html 這里記錄的是很簡單的幾種多線程TCP服務器模型,順便可以比較下:
2.1 主線程accept,為每個client創建一個線程
2.2 使用線程池,全部accept,當有連接來的時候其中某個線程進行處理
2.3 使用線程池,主線程accept,當有連接來的時候主線程將其放入隊列,由工作線程進行處理(生產者-消費者模型)
1方案過于頻繁地進行線程創建銷毀,2方案在一個連接過來時會帶來驚群現象,3方案會比前兩個方案要好一些。