1、套接字選項:算法
有如下3中方式能夠對套接字選項進行設置:服務器
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最大分段值 |
一、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 選項還須要注意下面兩點:
下面是設置套接字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));