代碼都code了一次,該總結下了:
首先,同步/非同步是個比較大的概念,它適用於很多方面,阻塞/非阻塞也不是只在socket裡有的,當然我們下面的討論主要在socket方面。
同步就是串列,要一個一個完成,不能跳著走,類似去政府辦個什麼手續,只有上個部門辦完了,才能去下個部門辦接下來的手續。
非同步就是有個通知機制,比如說政府職能轉變好了後,你可以給他的相關部門打個電話說你要辦什麼,他辦好後後會通知你說辦好了,在他辦的過程中你可以幹別的。這個通知影射到具體代碼上就是訊號 或者 回呼函數。
阻塞主要是說函數在沒有得到她想要的資料時就在那裡等,直到有資料為止。
非阻塞就是看一下有沒有資料,有的話就繼續下面的工作,沒有就返回,你需要做的就是反覆去看有沒有資料。
同步/非同步 阻塞/非阻塞 組合起來就有4種:
同步阻塞, 同步非阻塞, 非同步阻塞, 非同步非阻塞。
1. 同步阻塞時最常見到的,平時code時,不特殊設定就是這個模式。
2. 同步非阻塞,相對也容易,只要設定一下socket屬性就可以了,一般來說加個這個就可以了:
if(fcntl(listenfd, F_SETFL, O_NONBLOCK) == -1)
{
printf("fcntl error: %s(errno=%d)\n",strerror(errno), errno);
exit(0);
}
這個是unix的做法,window有自己的函數設定。
這個模式,其實效率很低,用的應該不多吧。
3. 非同步阻塞
我看好多地方把select 和 poll放這裡,那就放著吧,其實我覺得他2個只是同步非阻塞的一個變種而已。
好多非阻塞的被一個調用監控著,如果某個fd或某幾個有資訊就會返回,處理這些資訊。
4. 非同步非阻塞
真正可以名副其實就是aio,他有設定訊號處理函數或者回呼函數的地方,真的不需要你再回頭處理接收到的資訊。
像epoll這種,更多的是poll的一個改進,當然它的改動有點大,他的回呼函數時固定的,優點在只返回有資訊的fd。
現在看網上的呼聲應該是epoll比aio好點,我並沒有實際測過。
http://www.cnblogs.com/hustcat/archive/2012/10/08/1708909.html