socket屬性控制

來源:互聯網
上載者:User
1進階通訊端函數 getsockopt和setsockopt

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)

level指定控制通訊端的層次.可以取三種值:
1)SOL_SOCKET:通用通訊端選項.
2)IPPROTO_IP:IP選項.
3)IPPROTO_TCP:TCP選項.

對應的optname詳細說明
optname指定控制的方式(選項的名稱).

選項名稱 說明 資料類型
======================================================================
SOL_SOCKET
SO_BROADCAST 允許發送廣播資料 int
SO_DEBUG 允許調試 int
SO_DONTROUTE 不尋找路由 int
SO_ERROR 獲得通訊端錯誤 int
SO_KEEPALIVE 保持串連 int
SO_LINGER 延遲關

SO_OOBINLINE 帶外資料放入正常資料流 int
SO_RCVBUF 接收緩衝區大小 int
SO_SNDBUF 發送緩衝區大小 int
SO_RCVLOWAT 接收緩衝區下限 int
SO_SNDLOWAT 發送緩衝區下限 int
SO_RCVTIMEO 接收逾時 struct timeval
SO_SNDTIMEO 發送逾時 struct timeval
SO_REUSERADDR 允許重用本地地址和連接埠 int
SO_TYPE 獲得通訊端類型 int
SO_BSDCOMPAT 與BSD系統相容 int

IPPROTO_IP
IP_HDRINCL 在資料包中包含IP首部 int
IP_OPTINOS IP首部選項 int
IP_TOS 服務類型
IP_TTL 存留時間 int

IPPRO_TCP
TCP_MAXSEG TCP最大資料區段的大小 int
TCP_NODELAY 不使用Nagle演算法 int

optval獲得或者是設定通訊端選項.根據選項名稱的資料類型進行轉換 ,有時是通訊端選項.ON或者OFF等

2 進階通訊端函數 ioctl

int ioctl(int fd,int req,...)
ioctl可以控制所有的檔案描述符的情況,這裡介紹一下控制通訊端的選項.
ioctl的控制選項
SIOCATMARK 是否到達帶外標記 int
FIOASYNC 非同步輸入/輸出標誌 int
FIONREAD 緩衝區可讀的位元組數 int

詳細的選項請用 man ioctl_list 查看.

3        進階通訊端函數 fcntl

status = fcntl (hand, option, mode ) ;

上述fcntl函數調用中,各參數定義如下:

    handle:已開啟的檔案控制代碼。

    option:一般可以是下列兩種值:

        F_GETFL:表示讀取檔案狀態值。

       F_SETFL:表示設定檔案狀態值。

(注意:F_GETFL和F_SETFL都被定義在fcntl.h)

    mode:如果optipn是F_GETFL,則這個參數值可以是任意值。如果是F_SETFL,則參數值可以是下列值:

 O_WRONLY:將檔案設定成唯寫狀態。

O_RDWR:   將檔案設定成讀寫狀態。

O_RDONLY:將檔案設定成唯讀狀態。

status:函數會將調用結果賦給status,如運行失敗,則status的值會被設成-1。

使用執行個體:

執行個體1:setsockopt

//使得地址可被重用
int optavl3=1; 
int optlen3 = sizeof(int);
getsockopt(s, SOL_SOCKET, SO_REUSEADDR, &optavl3, &optlen3);

 

執行個體2:fcntl

//設定socket非阻塞
void setnonblocking(int sock)
...{
    int opts;
    opts = fcntl(sock, F_GETFL);
    if (opts < 0)
    ...{
        perror("fcntl(sock, GETFL)");
        exit(1);
    }
    opts = opts|O_NONBLOCK;
    if (fcntl(sock, F_SETFL, opts) < 0)
    ...{
        perror("fcntl(sock, SETFL, opts)");
        exit(1);
    }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.