Linux 網絡編程 高級套接字

1、套接字選項:算法

有如下3中方式能夠對套接字選項進行設置:服務器

  • getsockopt 和 setsockopt 函數
  • fcntl函數
  • ioctl函數

getsockopt和setsockopt函數用於得到和設置套接字的選項值,fcntl用來操做文件描述符的有關屬性,好比設置套接字文件描述符工做於非阻塞模式等,而ioctl用於控制I/O設備。函數

套接字選項和協議層spa

協議層(Level)
選項(optname) 含義
SOL_SOCKET
(套接字通用選項)
SO_KEEPALIVE
O_RESUSEADDR
SO_LINGER
SO_SNDBUF
SO_RCVBUF
SO_TYPE
SO_ERROR
……
容許TCP連接保活檢測
容許本地地址被重用
容許TCP鏈接保持一段時間知道數據發送完畢
套接字發送緩衝大小
套接字接收緩衝大小
得到套接字類型
得到套接字易發生的錯誤並清除
….
SOL_TCP
(TCP協議層選項)
SO_NODELAY
TCP_MAXSEG
禁止TCP  Nagle算法
TCP最大分段值
 
2、套接字通用選項示例
 
 
      協議無關是指這些選項是由內核中與協議無關的代碼來處理的,而不是依賴於 諸如IPv4等和具體IP協議相關的模塊
 
 

一、SO_KEEPALIVE  code

    當對TCP套接字設置了保活選項後,若在兩小時內TCP鏈接雙方沒有發送過任何數據,則設置了該選項方TCP將自動向對方發送保活探測分段,而且接收方TCP必須應答此分段。blog

    雖然客戶端也可使用該選項,可是該選項一般是由服務器使用,由於服務器每每老是處於阻塞狀態,並等待客戶端發來的請求,因此如
果一個客戶端因爲關機或者待機等緣由而斷開和服務器創建的連接後,服務器進程就沒法及時知道此狀況,這將致使服務器一直爲這些已經斷開的鏈接繼續分配寶貴的資源,保活選項能夠檢測出此狀況。進程

 

下面是使用SO_KEEPALIVE 選項檢測丟失鏈接的代碼段:ci

#define TRUE     1
#define FALSE    0
int ret;
int sockfd;
int so_keepalive;

so_keepalive = TRUE;
ret = setsockopt(sockfd,SOL_SOCKET,SO_KEEPALIVE,&so_keepalive,sizeof(so_keepalive));

 

二、SO_REUSEADDR 資源

     當結束一個已經成功創建了TCP鏈接的服務器的運行後,若馬上從新啓動該服務器,則服務器不能再次綁定到徹底相同的地址端口,根據TCP協議的規定,當服務器斷開鏈接後,做爲TCP鏈接的一個組成部分,該衆所周知的端口將處於2MSL狀態,須要通過1~4分鐘後才能從新使用,爲了儘快啓動服務器從新監聽,經過設置SO_REUSEADDR選項,可讓服務器馬上再次綁定到同一個端口…..get

另外,使用SO_REUSEADDR 選項還須要注意下面兩點:

  •  沒有其餘的具備相同IP地址和端口的TCP套接字正處於監聽狀態;
  • 全部具備相同IP地址和端口的套接字的SO_REUSADDR選項設置都必須設爲真

下面是設置套接字SO_REUSEADDR 選項的代碼片斷:

#define TRUE 1
#define FALSE 0
int ret;
int sockfd;
int so_useaddr;

so_useaddr = TRUE;
ret  = setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&so_useaddr,sizeof(so_useaddr));
相關文章
相關標籤/搜索