[轉] socket 設置選項 setsockopt() 使用方法。SO_REUSERADDR TCP_NODELAY SO_RCVTIMEO SO_SNDTIMEO

出處:http://blog.csdn.net/newyf_cun/article/details/8075929

1. socket設置選項總結:
用法:
  
1.  #include <sys/types.h>  
2.  #include <sys/socket.h>  
3.  int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen);  
4.  int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);  
參數詳細說明:
level指定控制通訊端的層次.可以取三種值:
1)SOL_SOCKET:通用通訊端選項.
2)IPPROTO_IP:IP選項.
3)IPPROTO_TCP:TCP選項. 
optname指定控制的方式(選項的名稱),
optval獲得或者是設置通訊端選項.根據選項名稱的資料類型進行轉換 

選項名稱        說明                  資料類型
========================================================================
            SOL_SOCKET
————————————————————————
SO_BROADCAST      允許發送廣播資料            int
SO_DEBUG          允許調試                int
SO_DONTROUTE        不查找路由               int
SO_ERROR          獲得通訊端錯誤             int
SO_KEEPALIVE        保持連接                int
SO_LINGER            延遲關閉連接              struct linger
SO_OOBINLINE        帶外資料放入正常資料流程         int
SO_RCVBUF          接收緩衝區大小             int
SO_SNDBUF          發送緩衝區大小             int
SO_RCVLOWAT       接收緩衝區下限             int
SO_SNDLOWAT       發送緩衝區下限             int
SO_RCVTIMEO        接收超時                struct timeval
SO_SNDTIMEO        發送超時                struct timeval
SO_REUSERADDR       允許重用本地位址和埠         int
SO_TYPE            獲得通訊端類型             int
SO_BSDCOMPAT     與BSD系統相容              int
========================================================================
            IPPROTO_IP
————————————————————————
IP_HDRINCL       在數據包中包含IP首部          int
IP_OPTINOS       IP首部選項               int
IP_TOS           服務類型
IP_TTL            生存時間                int
========================================================================
            IPPRO_TCP
————————————————————————
TCP_MAXSEG       TCP最大資料段的大小           int
TCP_NODELAY        不使用Nagle演算法             int
========================================================================
返回說明:
成功執行時,返回0。失敗返回-1,errno被設為以下的某個值
EBADF:sock不是有效的檔描述詞
EFAULT:optval指向的記憶體並非有效的進程空間
EINVAL:在調用setsockopt()時,optlen無效
ENOPROTOOPT:指定的協定層不能識別選項
ENOTSOCK:sock描述的不是通訊端
Nagle演算法設置。
   
Linux環境使用TCP_CORK
   
標頭檔/usr/include/netinet/tcp.h
   
1.  #define TCP_NODELAY      1      /* Don’t delay send to coalesce packets  */  
2.  #define TCP_MAXSEG       2      /* Set maximum segment size  */  
3.  #define TCP_CORK         3      /* Control sending of partial frames  */  
4.  #define TCP_KEEPIDLE     4      /* Start keeplives after this period */  
5.  #define TCP_KEEPINTVL    5      /* Interval between keepalives */  
6.  #define TCP_KEEPCNT      6      /* Number of keepalives before death */  
7.  #define TCP_SYNCNT       7      /* Number of SYN retransmits */  
8.  #define TCP_LINGER2      8      /* Life time of orphaned FIN-WAIT-2 state */  
9.  #define TCP_DEFER_ACCEPT 9      /* Wake up listener only when data arrive */  
10. #define TCP_WINDOW_CLAMP 10     /* Bound advertised window */  
11. #define TCP_INFO         11     /* Information about this connection. */  
12. #define TCP_QUICKACK     12     /* Bock/reenable quick ACKs.  */  

 
1.  int  cork;  
2.  cork = 1;  
3.  return setsockopt(s, IPPROTO_TCP, TCP_CORK,  
4.                    (const void *) &cork, sizeof(int));  
  
FreeBSD環境使用TCP_NOPUSH
1.  int tcp_nopush;  
2.  tcp_nopush = 1;  
3.  setsockopt(s, IPPROTO_TCP, TCP_NOPUSH,  
4.                    (const void *) &tcp_nopush, sizeof(int));  
1.2.來自網上的描述。
TCP_MAXSEG TCP最大資料段的大小 int獲取或設置TCP連接的最大分節大小(MSS)。返回值是我們的TCP發送給另一端的最大資料量,它常常就是由另一端用SYN分節通告的MSS,除非我們的TCP選擇使用一個比對方通告的MSS小些的值。如果此值在套介面連接之前取得,則返回值為未從另·—端收到Mss選項的情況下所用的缺省值。小於此返回值的信可能真正用在連接上,因為譬如說使用時間戳記選項的話,它在每個分節上佔用12位元組的TCP選項容量。我們的TcP將發送的每個分節的最大資料量也可在連接存活期內改變,但前提是TCP要支援路徑MTU 發現功能。如果到對方的路徑改變了,此值可上下調整。TCP_NODELAY 不使用Nagle演算法 int指定TCP開始發送保持存活探測分節前以秒為單位的連接閒置時間。缺省值至少必須為7200秒,即2小時。此選項僅在SO_KEPALIVEE套介面選項打開時才有效。TCP_NODELAY 和 TCP_CORK,這兩個選項都對網路連接的行為具有重要的作用。許多UNIX系統都實現了TCP_NODELAY選項,但是,TCP_CORK則是Linux系統所獨有的而且相對較新;它首先在內核版本2.4上得以實現。此外,其他UNIX系統版本也有功能類似的選項,值得注意的是,在某種由BSD派生的系統上的 TCP_NOPUSH選項其實就是TCP_CORK的一部分具體實現。TCP_NODELAY和TCP_CORK基本上控制了包的“Nagle化”,Nagle化在這裡的含義是採用Nagle演算法把較小的包組裝為更大的幀。 John Nagle是Nagle演算法的發明人,後者就是用他的名字來命名的,他在1984年首次用這種方法來嘗試解決福特汽車公司的網路擁塞問題(欲瞭解詳情請參看IETF RFC 896)。他解決的問題就是所謂的silly window syndrome ,中文稱“愚蠢視窗症候群”,具體含義是,因為普遍終端應用程式每產生一次擊鍵操作就會發送一個包,而典型情況下一個包會擁有一個位元組的資料載荷以及40 個位元組長的包頭,於是產生4000%的超載,很輕易地就能令網路發生擁塞,。 Nagle化後來成了一種標準並且立即在網際網路上得以實現。它現在已經成為缺省配置了,但在我們看來,有些場合下把這一選項關掉也是合乎需要的。現在讓我們假設某個應用程式發出了一個請求,希望發送小塊資料。我們可以選擇立即發送資料或者等待產生更多的資料然後再一次發送兩種策略。如果我們馬上發送資料,那麼交互性的以及客戶/伺服器型的應用程式將極大地受益。例如,當我們正在發送一個較短的請求並且等候較大的回應時,相關超載與傳輸的資料總量相比就會比較低,而且,如果請求立即發出那麼回應時間也會快一些。以上操作可以通過設置通訊端的TCP_NODELAY選項來完成,這樣就禁用了Nagle 演算法。另外一種情況則需要我們等到資料量達到最大時才通過網路一次發送全部資料,這種資料傳輸方式有益於大量資料的通信性能,典型的應用就是檔案伺服器。應用 Nagle演算法在這種情況下就會產生問題。但是,如果你正在發送大量資料,你可以設置TCP_CORK選項禁用Nagle化,其方式正好同 TCP_NODELAY相反(TCP_CORK 和 TCP_NODELAY 是互相排斥的)。下面就讓我們仔細分析下其工作原理。假設應用程式使用sendfile()函數來轉移大量資料。應用協定通常要求發送某些資訊來預先解釋資料,這些資訊其實就是報頭內容。典型情況下報頭很小,而且通訊端上設置了TCP_NODELAY。有報頭的包將被立即傳輸,在某些情況下(取決於內部的包計數器),因為這個包成功地被對方收到後需要請求對方確認。這樣,大量資料的傳輸就會被推遲而且產生了不必要的網路流量交換。但是,如果我們在通訊端上設置了TCP_CORK(可以比喻為在管道上插入“塞子”)選項,具有報頭的包就會填補大量的資料,所有的資料都根據大小自動地通過包傳輸出去。當資料傳輸完成時,最好取消TCP_CORK 選項設置給連接“拔去塞子”以便任一部分的幀都能發送出去。這同“塞住”網路連接同等重要。總而言之,如果你肯定能一起發送多個資料集合(例如HTTP回應的頭和正文),那麼我們建議你設置TCP_CORK選項,這樣在這些資料之間不存在延遲。能極大地有益於WWW、FTP以及檔案伺服器的性能,同時也簡化了你的工作。
未經允許不得轉載:GoMCU » [轉] socket 設置選項 setsockopt() 使用方法。SO_REUSERADDR TCP_NODELAY SO_RCVTIMEO SO_SNDTIMEO