setsockopt函式用法

2021-10-17 18:30:34 字數 2433 閱讀 3569

在tcp連線中,recv等函式預設為阻塞模式(block),即直到有資料到來之前函式不會返回,而我們有時則需要一種超時機制使其在一定時間後返回而不管是否有資料到來,這裡我們就會用到setsockopt()函式:

int  setsockopt(int  s, int level, int optname, void* optval, socklen_t* optlen);

s(套接字):指向乙個開啟的套介面描述字

level:(級別):指定選項**的型別。

sol_socket: 基本套介面

ipproto_ip: ipv4套介面

ipproto_ipv6: ipv6套介面

ipproto_tcp: tcp套介面

optname(選項名):當級別為通用套接字選項sol_socket時

1、so_reuseraddr 允許重用本地位址和埠 int;這個設定常在伺服器中使用。例如:某個伺服器程序占用了tcp的80埠進行偵聽,當再次在此埠偵聽的時候,會返回錯誤,那麼設定so_reuseraddr可以解決這個問題,允許共用這個埠。某些非正常退出的伺服器程式,可能需要占用埠一段時間才能允許其他程序使用,即使這個程式已經死掉了。核心仍然需要一段時間才能釋放這個埠。一般這個時間為2分鐘。

2、so_rcvtimeo 接收超時 struct timeval  

3、so_sndtimeo 傳送超時 struct timeval

4、so_broadcast 允許傳送廣播資料 int ;   適用於 udp socket。其意義是允許 udp socket 「廣播」(broadcast)訊息到網路上(套接字預設不允許傳送廣播包)。  為了防止一些程式並不是設計用來傳送廣播訊息,因為使用者的錯誤輸入,而傳送了廣播訊息,比如乙個udp 程式接受乙個目標ip位址做為命令列引數,但使用者卻把這個位址寫成了乙個廣播位址這時候這個選項的作用就體現出來了,與其讓這個udp程式檢驗使用者輸入的是不是個廣播位址,不如讓核心來檢測,如果是乙個廣播位址,但so_broadcast 選項卻沒有被設定, eacces錯誤就會被返回     

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

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

setsockopt(s,sol_socket,so_rcvbuf,(const char*)&nrecvbuf,sizeof(int)); // 接收緩衝區             

6、so_sndbuf:

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

setsockopt(s,sol_socket,so_sndbuf,(const char*)&nsendbuf,sizeof(int)); //傳送緩衝區

當級別為通用套接字選項ipproto_ip時:

ip_add_membership 將ip新增到組 struct ip_mreq

struct ip_mreq merq;

merq.imr_multiaddr.s_addr = inet_addr("234.234.234.234");

merq.imr_inte***ce.s_addr = inet_addr("192.168.50.6");

setsockopt(fd,ipproto_ip,ip_add_membership,&merq,sizeof(merq));

optval(選項值):是乙個指向變數的指標 型別:整形,套介面結構, 其他結構型別:linger{}, timeval

optlen(選項長度) :optval 的大小

這裡我們要涉及到乙個結構:

struct timeval

;這裡第乙個域的單位為秒,第二個域的單位為微秒。

struct timeval tv_out;

tv_out.tv_sec = 1;

tv_out.tv_usec = 0;

填充這個結構後,我們就可以以如下的方式呼叫這個函式:

setsockopt(fd, sol_socket, so_rcvtimeo, &tv_out, sizeof(tv_out));(具體引數可以man一下,或檢視msdn)

這樣我們就設定了recv()函式的超時機制,當超過tv_out設定的時間而沒有資料到來時recv()就會返回0值。

setsockopt函式用法

設定套介面的選項。include include include int setsockopt int sockfd,int level,int optname,const void optval,socklen t optlen sockfd 標識乙個套介面的描述字。level 選項定義的層次 目...

Setsockopt 函式用法

setsockopt 函式用法 1.關閉套接字後想繼續重用該 socket 一般執行 closesocket 後,不會立即關閉,會經歷 time wait 的過程 boolbreuseaddr true setsockopt s,sol socket,so reuseaddr,constchar b...

setsockopt函式的用法

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