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