1.設置/獲取套接字選項
int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len); int getsockopt(int socket, int level, int option_name, void *restrict option_value, socklen_t *restrict option_len);
2.常用套接字選項的運用
SO_REUSEADDR選項
設置該選項, 可以確保服務器快速重啟時,不會因為監聽的端口被占用而失敗。
SO_KEEPALIVE選項
服務器端設置該選項,可以定時檢測客戶端的狀態。如果客戶端因為異常退出, 則套接字被關閉,檢測的默認時間間隔為2小時。
如何設置時間間隔?
修改 /ect/sysctl.conf
添加如下3行:
net.ipv4.tcp_keepalive_intvl=20//失敗探測間隔時間20秒 net.ipv4.tcp_keepalive_probes=3//失敗探測次數 net.ipv4.tcp_keepalive_time=60//間隔時間
然後重啟內核:sysctl -p;
SO_LINGER選項
如果選擇此選項,close或 shutdown將等到所有套接字裡排隊的消息成功發送或到達延遲時間後才會返回。否則,調用將立即返回。
SO_CONNECT_TIME選項
查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/
通過 getsockopt獲取該選項的值。可以用來判斷這個SOCKET是否已經超時。是防止攻擊服務器的好方法。
設置SOCKET為非阻塞
static void setnonblocking(int sock) { int opts; opts=fcntl(sock,F_GETFL); if(opts<0) { exit(1); } opts = opts|O_NONBLOCK; if(fcntl(sock,F_SETFL,opts)<0) { exit(1); } }