getsockopt 和 setsockopt講解
這兩個函數是用來獲取和設置影響套接字的選項,且只能用於套接字。
函數原型如下:
#include<sys/socket.h>
int getsockopt(int sockfd,int level,int optname,
void *optval,socklen_t *optlen);
int setsockopt(int sockfd,int level,int optname,
const void *optval,socklen_t optlen);
其中,sockfd必須指向一個打開的套接字。
level指定系統中解釋選項的代碼或爲通用套接字代碼,或爲某個特定於協議的代碼。有如下一些值:
- SOL_SOCKET 通用套接字
- IPPROTO_IP IPV4 套接字
- IPPROTO_ICMPV6 ICMPV6套接字
- IPPROTO_IPV6 IPV6 套接字
- IPPROTO_TCP TCP 套接字選項
IPPROTO_STCP SCTP 套接字選項
optname對應的套接字有各種各樣的選項的選項名,他們可以用來控制該套接字的一些行爲。套接字選項粗可分爲兩大基本類型:
- 啓用或禁止某個特性的二元選項(稱爲標誌選項)
- 取得並返回我們可以設置或檢查的特定值的選項(稱爲值選項)
因爲選項很多,這裏不能列舉出來,建議讀者可以翻閱《UNIX網絡編程 卷一》 P151-152,裏面對各種級別的套接字的選項名和意義都有說明。
setsockopt從 *optval中取得選項帶設置的值,而getsockopt則將已經獲取的選項的當前值存放在 *optval中。*optval在getsockopt中是個值-結果參數,而在setsockopt中是個值參數。其中標誌選項對應的optval值爲0,1。 0表示選項被禁止,1表示開啓。
*optval的大小由最後一個參數指定。
下面舉個使用setsockopt的例子:
int sock_fd;
struct sctp_event_subscibe events;
bzero(&events,sizeof(events));
events.sctp_data_io_event = 1;
sock_fd = socket(AF_INET,SOCK_SEQPACKET,IPPROTO_SCTP); //創建一個SCTP一到多式套接字
//客戶不想得到MSG_NOTIFICATION事件,因此要禁止這些事件,只允許sctp_data_io_event
setsockopt(sock_fd,IPPROTO_SCTP,SCTP_EVENTS,&events,sizeof(events));