setsockopt的常用選項

2021-09-24 14:02:01 字數 2573 閱讀 6906

#include

#include

intsetsockopt

(int sockfd,

int level,

int optname,

const

void

*optval, socklen_t optlen)

;

(1)如果在已經處於 established狀態下的socket(一般由埠號和標誌符區分)呼叫close(socket)(一般不會立即關閉而經歷time_wait的過程)後想繼續重用該socket:

int reuse=1;

setsockopt(s,sol_socket ,so_reuseaddr,(const char*)& reuse,sizeof(int));

注意:必須在呼叫bind函式之前設定so_reuseaddr選項。

(2)如果要已經處於連線狀態的soket在呼叫close(socket)後強制關閉,不經歷time_wait的過程:

int reuse=0;

setsockopt(s,sol_socket ,so_reuseaddr,(const char*)& reuse,sizeof(int));

(3)在send(),recv()過程中有時由於網路狀況等原因,發收不能預期進行,而設定收發時限:

int nnettimeout=1000; // 1秒

// 傳送時限

setsockopt(socket,sol_s0cket, so_sndtimeo,(char *)&nnettimeout,sizeof(int));

// 接收時限

setsockopt(socket,sol_s0cket, so_rcvtimeo,(char *)&nnettimeout,sizeof(int));

(4)在send()的時候,返回的是實際傳送出去的位元組(同步)或傳送到socket緩衝區的位元組(非同步),系統預設的狀態傳送和接收一次為8688位元組(約為8.5k);在實際的過程中傳送資料和接收資料量比較大,可以設定socket緩衝區,而避免了send(),recv()不斷的迴圈收發:

// 接收緩衝區

int nrecvbuf=32*1024; // 設定為32k

setsockopt(s,sol_socket,so_rcvbuf,(const char*)&nrecvbuf,sizeof(int));

// 傳送緩衝區

int nsendbuf=32*1024; // 設定為32k

setsockopt(s,sol_socket,so_sndbuf,(const char*)&nsendbuf,sizeof(int));

注意:並不是說你設定的多大,系統就會設定多大,系統一般會將我們設定的緩衝區大小加倍,並且不得小於tcp的接收緩衝區和傳送緩衝區設定的預設最小值。

注意:tcp有傳送緩衝區和接收緩衝區,但是udp因為是不可靠的,它沒有確認重傳機制,不儲存應用程式資料的副本,所以是沒有傳送緩衝區的,但是udp有接收緩衝區。

(5)如果在傳送資料時,希望不經歷由系統緩衝區到socket緩衝區的拷貝而影響程式的效能:

int nzero=0;

setsockopt(socket,sol_socket,so_sndbuf,(char *)&nzero,sizeof(int));

(6)同上在recv()完成上述功能(預設情況是將socket緩衝區的內容拷貝到系統緩衝區):

int nzero=0;

setsockopt(socket,sol_socket,so_rcvbuf,(char *)&nzero,sizeof(int));

(7)一般在傳送udp資料報的時候,希望該socket傳送的資料具有廣播特性:

int bbroadcast = 1;

setsockopt(s, sol_socket, so_broadcast, (const char*)&bbroadcast, sizeof(int));

(8)設定存活檢測

int opt = 1;

if (setsockopt (m_nsock, sol_socket, so_keepalive, &opt, sizeof(int)) == -1)

(9)延遲接收

實際上就是當接收到第乙個資料之後,才會建立連線。對於像http這類非互動式的伺服器,這個很有意義,可以防禦空連線攻擊。

int val = 5;

setsockopt(fd, sol_tcp, tcp_defer_accept, &val, sizeof(val));

開啟這個功能後,核心在val時間之類還沒有收到資料,不會繼續喚醒程序,而是直接丟棄連線。

從三次握手上講,就是設定這個狀態之後,就算完成了三次握手,伺服器socket狀態也不是established,而依然是 syn_rcvd,不會去接收資料。

setsockopt函式選項總結

1.closesocket 一般不會立即關閉而經歷time wait的過程 後想繼續重用該socket bool breuseaddr true setsockopt s,sol socket so reuseaddr,const char breuseaddr,sizeof bool 2.如果要已...

setsockopt常用設定

1.如果在已經處於 established狀態下的socket 一般由埠號和標誌符區分 呼叫closesocket 一般不會立即關閉而經歷time wait的過程 後想繼續重用該socket bool breuseaddr true setsockopt s,sol socket so reusea...

setsockopt函式的用法

1.closesocket 一般不會立即關閉而經歷time wait的過程 後想繼續重用該socket bool breuseaddr true setsockopt s,sol socket so reuseaddr,const char breuseaddr,sizeof bool 2.如果要已...