高效能伺服器之select

2021-08-02 14:20:12 字數 2956 閱讀 7726

系統提供select函式來實現多路復⽤用輸⼊入/輸出模型。select系統調⽤用是⽤用來讓我們的程式監視 多個⽂檔案控制代碼的狀態變化的。程式會停在select這⾥裡等待,直到被監視的⽂檔案控制代碼有⼀乙個或 多個發⽣生了狀態改變

int select(int nfds,fd_set * readfds,fd_set*writefds,fd_set*exceptfds,struct timeval*timeout)

(1)引數nfds是需要監視的最⼤大的⽂檔案描述符值+1; (2)rdset,wrset,exset分別對應於需要檢測的可讀⽂檔案描述符的集合,可寫⽂檔案描述符的集 合及異 常⽂檔案描述符的集合。 struct timeval結構⽤用於描述⼀一段時間長度,如果在這個時間內,需要監視的描述符沒有事件 發⽣生則函式返回,返回值為0。 下⾯面的巨集提供了處理這三種描述片語的⽅方式: fd_clr(inr fd,fd_set* set);⽤用來清除描述片語set中相關fd 的位 fd_isset(int fd,fd_set *set);⽤用來測試描述片語set中相關fd 的位是否為真 fd_set(int fd,fd_set*set);⽤用來設定描述片語set中相關fd的位 fd_zero(fd_set *set);⽤用來清除描述片語set的全部位 引數timeout為結構timeval,⽤用來設定select()的等待時間,其結構定義如下

struct timeval

(3)如果引數timeout設為: null:則表⽰示select()沒有timeout,select將⼀一直被阻塞,直到某個⽂檔案描述符上發⽣生了 事件。 0:僅檢測描述符集合的狀態,然後⽴立即返回,並不等待外部事件的發⽣生。 特定的時間值:如果在指定的時間段⾥裡沒有事件發⽣生,select將超時返回。 函式返回值: 執⾏行成功則返回⽂檔案描述詞狀態已改變的個數 如果返回0代表在描述詞狀態改變前已超過timeout時間,沒有返回; 當有錯誤發⽣生時則返回-1,錯誤原因存於errno,此時引數readfds,writefds,exceptfds和 timeout的值變成不可**。錯誤值可能為: ebadf ⽂檔案描述詞為⽆無效的或該⽂檔案已關閉 eintr 此調⽤用被訊號所中斷 einval 引數n 為負值。 enomem 核⼼心記憶體不⾜

3,**:

伺服器端:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc,char* argv)

int sock=socket(af_inet,sock_stream,0);

if(sock<0)

struct sockaddr_in server;

server.sin_family=af_inet;

server.sin_port=htons(atoi(argv[2]));

server.sin_addr.s_addr=inet_addr(argv[1]);

int c=connect(sock,(struct sockaddr*)&server,sizeof(server));

if(c>0)

return

0;}

伺服器端

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int statup(char*ip,int port)

struct sockaddr_in local;

local.sin_addr.s_addr=inet_addr(ip);

local.sin_port=htons(port);

socklen_t len=sizeof(local);

int b=bind(sock,(struct sockaddr*)&local,len);

if(b<0)

int l=listen(sock,10);

if(l<0)

return sock;

}int main(int argc,char* argv)

int listen_sock=statup(argv[1],atoi(argv[2]));

int r_arr[10];

int i;

for(i=0;i<10;i++)

fd_set rfds;

r_arr[0]=listen_sock;

while(1)

;for(i=0;i<10;i++)

}if(i==10)

close(newsock);

}//accept success

else

//accept false

} //is listen

else

if(j>0 && fd_isset(r_arr[j],&rfds))

else

if(s>0)

else

}//isn"t listen sock

}//for j

// int k;

for(k=0;k<10;k++) //resolve write

} //for k

}//default

break;

}//swith

}//while

return

0;}

高效能伺服器之epoll

什麼是epoll epoll是什麼?是為處理 大批量控制代碼 而作了改進的poll。它 幾乎具備了之前所說的 一切優點,被公認為linux2.6下效能最好的多路i o就緒通 知 方法。epoll的相關系統調 用 epoll只有epoll create,epoll ctl,epoll wait 3個系...

高效能伺服器設計

原文 http blog.chinaunix.net u 5251 showart 236329.html 先後檢視了 haproxy l7sw 和lighttpd 的相關原始碼,無一例外,他們一致認為多路復用是效能最好的伺服器架構 事實也確實應該如此,程序的出現一方面就是為了儲存任務的執行上下文從...

高效能伺服器設計

先後檢視了haproxy l7sw 和lighttpd 的相關原始碼,無一例外,他們一致認為多路復用是效能最好的伺服器架構。事實也確實應該如此,程序的出現一方面就是為了儲存任務的執行上下文從而簡化應用程式設計,如果程式的邏輯結構不是很複雜,那麼用整個程序控制塊來儲存執行上下文未免有些大材小用,加上程...