getsockopt和setsockopt函数
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                getsockopt和setsockopt函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                ? ? 在Unix網絡編程中通常用到getsockopt和setsockopt兩個函數來獲取和設置套接口的選項。
? ? getsockopt()函數用于獲取任意類型、任意狀態套接口的選項當前值,并把結果存入optval。
#include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); /**sockfd: 一個標識套接口的描述字*level:選項定義的層次。例如,支持的層次有SOL_SOCKET、IPPROTO_TCP等。*optname:需獲取的套接口選項。*optval:指針,指向存放所獲得選項值的緩沖區。*optlen:指針,指向optval緩沖區的長度值。 */? ? setsockopt()函數用于任意類型、任意狀態套接口的設置選項值。盡管在不同協議層上存在選項,但本函數僅定義了最高的"套接口"層次上的選項。
#include <sys/socket.h> int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); /* * sockfd: 標識一個套接口的描述字。 * level: 選項定義的層次:支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6等。 * optname: 需設置的選項。 * optval: 指針,指向存放選項值的緩沖區。 * optlen: optval緩沖區長度。 */? ? 以上兩個函數僅用于套接口,sockfd必須指向一個打開的套接口,level指定系統中解釋選項的代碼,普通套接口代碼或特定于協議的代碼(例如: IPv4、IPv6或TCP)。
? ? optval是一個指向變量的指針,通過它,或由setsockopt取得選項的新值,或由getsockopt存儲選項的當前值。此變量的大小由最后一個參數指定,對于setsockopt,它是一個值,對getsockopt來說,它是一個出參。
? ? 下表總結了由getsockopt獲取或由setsockopt設置的一些選項,"數據類型"列給出了指針optval必須指向的每個選項的數據類型。其中,用花括號的標記來表示一個結構,如linger{}表示結構linger。
? ? level級別:SOL_SOCKET
| optname(選項名) | 選項值數據類型 | 訪問 | 說明 | 
| SO_ACCEPTCONN | bool | get | 如為TRUE(真),表明套接字處于監聽模式 | 
| SO_BROADCAST | bool | get/set | 如TRUE,表明套接字已配置成對廣播消息進行發送 | 
| SO_CONNECT_TIME | int | get | 返回套接字建立連接的時間,以秒為單位,如尚未連接,返回0xffffffff | 
| SO_DEBUG | bool | get/set | 如果TRUE,就允許調試輸出(W32不支持) | 
| SO_DONTLINGER | bool | get/set | 如果是TRUE,則禁用SO_LINGER | 
| SO_LINGER | struct linger | get/set | 設置或獲取當前的拖延值 | 
| SO_DONTROUTE | bool | get/set | 如果TRUE,便直接向網絡接口發送消息,無需查詢路由表 | 
| SO_ERROR | bool | get | 返回錯誤狀態 | 
| SO_EXCLUSIVEADDRUSE | bool | get/set | 如果TRUE,套接字綁定那個本地端口就不能重新被另一個進程使用 | 
| SO_KEEPALIVE | bool | get/set | 如果TRUE,套接字就會進行配置,在會話過程中發送“保持活動”消息 | 
| SO_MAX_MSG_SIZE | unsigned int | get | 對一個面向消息的套接字來說,一條消息的最大長度 | 
| SO_OOBINLINE | bool | get/set | 如果是TRUE,帶外數據就會在普通數據流中返回(W32不支持) | 
| SO_PROTOCOL_INFO | WSAPROTOCOL_INFO | get | 套接字綁定的那種協議的特征 | 
| SO_RCVBUF | int | get/set | 面向接收操作,為每個套接字分別獲取或設置緩沖區長度 | 
| SO_REUSEADDR | bool | get/set | 如果是TRUE,套接字就可與一個正由其他套接字使用的地址綁定到一起,或與處在TIME_WAIT狀態的地址綁定到一起 | 
| SO_SNDBUF | bool | get/set | 返回指定套接字的類型(如SOCK_DGRAM和SOCK_STREAM等等) | 
| SO_SNDTIMEO | int | get/set | 獲取或設置套接字上的數據發送超時事件(以毫秒為單位) | 
| SO_RCVTIMEO | int | get/set | 獲取或設置與套接字上數據接收對應的超時時間值(以毫秒為單位) | 
| SO_RCVTIMEO | int | get/set | 獲取或設置與套接字上數據接收對應的超時時間值(以毫秒為單位) | 
| SO_UPDATE_ACCEPT_CONTEXT | SOCKET | get/set | 更新SOCKET狀態 | 
level級別:IPPROTO_IP
| optname(選項名) | 選項值數據類型 | 訪問 | 說明 | 
| IP_OPTIONS | char[] | get/set | 設置或獲取IP頭內的IP選項 | 
| IP_HDRINCL | bool | get/set | 如果是TRUE,IP頭就會隨即將發送的數據一起提交,并從讀取的數據中返回 | 
| IP_TOS | int | get/set | IP服務類型 | 
| IP_TTL | int | get/set | IP協議的"存在時間"(TTL) | 
| IP_MULTICAST_IF | unsigned long | get/set | 獲取或設置打算從它上面發出多播數據的本地接口 | 
| IP_MULTICAST_TTL | int | get/set | 為套接字獲取或設置多播數據包的存在時間 | 
| IP_MULTICAST_LOOP | bool | get/set | 如果TRUE,發至多播地址的數據將原封不動地"反射"或"反彈"回套接字的進入緩沖區 | 
| IP_ADD_MEMBERSHIP | struct ip_mreq | set | 在指定的IP組內為套接字賦予成員資格 | 
| IP_DROP_MEMBERSHIP | struct ip_mreq | set | 將套接字從指定的IP組內刪去(撤銷成員資格) | 
| IP_DONTFRAGMENT | bool | get/set | 如果是TRUE,就不對IP數據進行分段 | 
level級別:IPPROTO_TCP
| optname(選項名) | 選項值數據類型 | 訪問 | 說明 | 
| TCP_NODELAY | bool | get/set | 若為TRUE,就會在套接字上禁用Nagle算法(只適用于流式套接字) | 
?
總結
以上是生活随笔為你收集整理的getsockopt和setsockopt函数的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: pread介绍
 - 下一篇: getsockname和getpeern