getsockopt 和 setsockopt講解

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));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章