1. SO_BROADCAST 套接字選項服務器
本選項開啓或禁止進程發送廣播消息的能力。只有數據報套接字支持廣播,而且還必須是在支持廣播消息的網絡上(例如以太網,令牌環網等)。咱們不可能在點對點鏈路上進行廣播,也不可能在基於鏈接的傳輸協議(例如TCP和SCTP)之上進行廣播。網絡
2. SO_DEBUG 套接字選項socket
本選項僅由TCP支持。當給一個TCP套接字開啓本選項時,內核將爲TCP在該套接字發送和接受的全部分組保留詳細跟蹤信息。這些信息保存在內核的某個環形緩衝區中,並可以使用trpt程序進行檢查。函數
3. SO_KEEPALIVE 套接字選項spa
給一個TCP套接字設置保持存活選項後,若是2小時內在該套接字的任何一方向上都沒有數據交換,TCP就自動給對端發送一個保持存活探測分節。這是一個對端必須相應的TCP分節,它會致使如下3種狀況之一。指針
(1)對端以指望的ACK響應。應用進程得不到通知(由於一切正常)。在又通過仍無動靜的2小時後,TCP將發出另外一個探測分節。進程
(2)對端以RST響應,它告知本端TCP:對端已崩潰且已從新啓動。該套接字的待處理錯誤被置爲ECONNRESET,套接字自己則被關閉。get
(3)對端對保持存活探測分節沒有任何響應。it
若是根本沒有對TCP的探測分節的響應,該套接字的待處理錯誤就被置爲ETIMEOUT,套接字自己則被關閉。然而若是該套接字收到一個ICMP錯誤做爲某個探測分節的響應,那就返回響應的錯誤,套接字自己也被關閉。select
本選項的功能是檢測對端主機是否崩潰或變的不可達(譬如撥號調制解調器鏈接掉線,電源發生故障等等)。若是對端進程崩潰,它的TCP將跨鏈接發送一個FIN,這能夠經過調用select很容易的檢測到。
本選項通常由服務器使用,不過客戶也可使用。服務器使用本選項時由於他們花大部分時間阻塞在等待穿越TCP鏈接的輸入上,也就是說在等待客戶的請求。然而若是客戶主機鏈接掉線,電源掉電或者系統崩潰,服務器進程將永遠不會知道,並將繼續等待永遠不會到達的輸入。咱們稱這種狀況爲半開鏈接。保持存活選項將檢測出這些半開鏈接並終止他們。
4. SO_LINGER 套接字選項
本選項指定close函數對面向鏈接的協議(例如TCP和SCTP,但不是UDP)如何操做。默認操做是close當即返回,可是若是有數據殘留在套接字發送緩衝區中,系統將試着把這些數據發送給對端。
5. SO_RCVBUF和SO_SNDBUF套接字選項
每一個套接字都有一個發送緩衝區和一個接收緩衝區。
接收緩衝區被TCP,UDP和SCTCP用來保存接收到的數據,直到由應用進程讀取。對於TCP來講,套接字接收緩衝區可用空間的大小限制了TCP通告對端的窗口大小。TCP套接字接收緩衝區不能夠溢出,由於不容許對端發出超過本端所通告窗口大小的數據。這就是TCP的流量控制,若是對端無視窗口大小而發出了超過窗口大小的數據,本端TCP將丟棄它們。然而對於UDP來講,當接收到的數據報裝不進套接字接收緩衝區時,該數據報就被丟棄。回顧一下,UDP是沒有流量控制的:較快的發送端能夠很容易的淹沒較慢的接收端,致使接收端的UDP丟棄數據報。
這兩個套接字選項容許咱們改變着兩個緩衝區的默認大小。對於不一樣的實現,默認值得大小能夠有很大的差異。若是主機支持NFS,那麼UDP發送緩衝區的大小常常默認爲9000字節左右的一個值,而UDP接收緩衝區的大小則常常默認爲40000字節左右的一個值。
當設置TCP套接字接收緩衝區的大小時,函數調用的順序很重要。這是由於TCP的出口規模選項時在創建鏈接時用SYN分節與對端互換獲得的。對於客戶,這意味着SO_RCVBUF選項必須在調用connect以前設置;對於服務器,這意味着該選項必須在調用listen以前給監聽套接字設置。給已鏈接套接字設置該選項對於可能存在的出口規模選項沒有任何影響,由於accept直到TCP的三路握手玩抽纔會建立並返回已鏈接套接字。這就是必須給監聽套接字設置本選項的緣由。
6. SO_RCVLOWAT 和 SO_SNDLOWAT套接字選項
每一個套接字還有一個接收低水位標記和一個發送低水位標記。他們由select函數使用,這兩個套接字選項容許咱們修改這兩個低水位標記。
接收低水位標記是讓select返回「可讀」時,套接字接收緩衝區中所需的數據量。對於TCP,UDP和SCTP套接字,其默認值爲1。發送低水位標記是讓select返回「可寫」時套接字發送緩衝區中所需的可用空間。對於TCP套接字,其默認值一般爲2048。UDP也使用發送低水位標記,然而因爲UDP套接字的發送緩衝區中可用空間的字節數從不改變(意味UDP並不爲由應用進程傳遞給它的數據報保留副本),只要一個UDP套接字的發送緩衝區大小大於該套接字的低水位標記,該UDP套接字就老是可寫。咱們記得UDP並無發送緩衝區,而只有發送緩衝區大小這個屬性。
7. SO_RCVTIMEO 和 SO_SNDTIMEO套接字選項
這兩個選項容許咱們給套接字的接收和發送設置一個超時值。注意,訪問他們的getsockopt和setsockopt函數的參數是指向timeval結構的指針,與select所用參數相同。這可以讓咱們用秒數和微妙數來規定超時。咱們經過設置其值爲0s和0μs來禁止超時。默認狀況下着兩個超時都是禁止的。
接收超時影響5個輸入函數:read,readv,recv,recvfrom和recvmsg。發送超時影響5個輸出函數:write,writev,send,sendto和sendmsg。
8. SO_REUSEADDR 和 SO_REUSEPORT 套接字選項
SO_REUSEADDR套接字選項能起到如下4個不一樣的功用。
(1)SO_REUSEADDR容許啓動一個監聽服務器並捆綁其衆所周知的端口,即便之前創建的將該端口用做他們的本地端口的鏈接仍存在。這個條件一般是這樣碰到的:
(a)啓動一個監聽服務器;
(b)鏈接請求到達,派生一個子進程來處理這個客戶;
(c)監聽服務器終止,但子進程繼續爲現有鏈接上的客戶提供服務;
(d)重啓監聽服務器。
默認狀況下,當監聽服務器在步驟d經過調用socket,bind和listen從新啓動時,因爲他試圖捆綁一個現有鏈接(即正由早先派生的那個子進程處理着的鏈接)上的端口,從而bind調用會失敗。可是若是該服務器在socket和bind兩個調用之間設置了SO_REUSEADDR套接字選項,那麼將成功。全部TCP服務器都應該指定本套接字選項,以容許服務器在這種狀況下被從新啓動。
(2)SO_REUSEADDR容許在同一端口上啓動同一服務器的多個實例,只要每一個實例捆綁一個不一樣的本地IP地址便可。對於TCP,咱們絕對不可能啓動捆綁相同IP地址和相同端口號的多個服務器:這是徹底重複的捆綁,即便咱們給第二個服務器設置了SO_REUSEADDR套接字也無論用。
(3)SO_REUSEADDR 容許單個進程捆綁同一端口到多個套接字上,只要每次捆綁指定不一樣的本地IP地址便可。
(4)SO_REUSEADDR容許徹底重複的捆綁:當一個IP地址和端口號已綁定到某個套接字上時,若是傳輸協議支持,一樣的IP地址和端口還能夠捆綁到另外一個套接字上。通常來講本特性僅支持UDP套接字。