Socket,非阻塞,fcntl

1、fcntl

  用如下方法將socket設置成爲非阻塞方式web

  int  flags = fcntl(socket,F_GETFL,0);編程

  fcntl(socket,F_SETFL,flags|O_NONBLOCK);瀏覽器

 

  將非阻塞的設置回阻塞能夠用網絡

  int  flags = fcntl(socket,F_GETFL,0);多線程

  fcntl(socket,F_SETFL,flags&~O_NONBLOCK);併發

------------------------------------------------------------------------socket

  #include <unistd.h>函數

  #include <fcntl.h>spa

 

  int fcntl(int fd, int cmd);線程

  int fcntl(int fd, int cmd, long arg);

  int fcntl(int fd, int cmd, struct flock *lock);

 

  [描述] fcntl()針對(文件)描述符提供控制。參數fd是被參數cmd操做(以下面的描述)的描述符。針對cmd的值,fcntl可以接受第三個參數int arg。

 

  Cmd值的F_GETFL和F_SETFL:  
  

  F_GETFL    取得fd的文件狀態標誌,如同下面的描述同樣(arg被忽略),在說明open函數時,已說明了文件狀態標誌。不幸的是,三個存取方式標誌

        (O_RDONLY ,O_WRONLY , 以及O_RDWR)並不各佔1位。(這三種標誌的值各是0 , 1和2,因爲歷史緣由,這三種值互斥 — 一個文件只能有這三種值之一。)

        所以首先必須用屏蔽字O_ACCMODE相與取得存取方式位,而後將結果與這三種值相比較。      

   F_SETFL    設置給arg描述符狀態標誌,能夠更改的幾個標誌是:O_APPEND,O_NONBLOCK,O_SYNC 和 O_ASYNC。而fcntl的文件狀態標誌總共有7個:

        O_RDONLY , O_WRONLY , O_RDWR , O_APPEND , O_NONBLOCK , O_SYNC和O_ASYNC

2、非阻塞socket

  1.三次握手同時作其餘的處理。connect要花一個往返時間完成,從幾毫秒的局域網到幾百毫秒或幾秒的廣域網。這段時間可能有一些其餘的處理要執行,好比數據準備,預處理等。
  2.用這種技術創建多個鏈接。這在web瀏覽器中很廣泛.
  3.因爲程序用select等待鏈接完成,能夠設置一個select等待時間限制,從而縮短connect超時時間。多數實現中,connect的超時時間在75秒到幾分鐘之間。有時程序但願在等待必定時間內結束,使用非阻塞connect能夠防止阻塞75秒,在多線程網絡編程中,尤爲必要。 例若有一個經過創建線程與其餘主機進行socket通訊的應用程序,若是創建的線程使用阻塞connect與遠程通訊,當有幾百個線程併發的時候,因爲網絡延遲而所有阻塞,阻塞的線程不會釋放系統的資源,同一時刻阻塞線程超過必定數量時候,系統就再也不容許創建新的線程(每一個進程因爲進程空間的緣由能產生的線程有限),若是使用非阻塞的connect,鏈接失敗使用select等待很短期,若是尚未鏈接後,線程馬上結束釋放資源,防止大量線程阻塞而使程序崩潰。



  目前connect非阻塞編程的廣泛思路是:
  在一個TCP套接口設置爲非阻塞後,調用connect,connect會在系統提供的errno變量中返回一個EINRPOCESS錯誤,此時TCP的三路握手繼續進行。以後能夠用select函數檢查這個鏈接是否創建成功

相關文章
相關標籤/搜索