Socket一些屬性設置記錄標記window/linux設置方法,如果沒標記則是不同系統下設置都相同。
udp/tcp 共有的屬性
- FIONBIO 設置socket是否爲阻塞非阻塞模式,默認創建的socket是阻塞模式。
設置非阻塞模式:
dwOn = true;
window:
ioctlsocket(m_hSocket, FIONBIO, &dwOn);
linux:
ioctl(m_hSocket, FIONBIO, &dwOn);
- SO_REUSEADDR 重複綁定設置
nSet = 1;
setsockopt(m_hSocket, SOL_SOCKET, SO_REUSEADDR, (s8*)&nSet, sizeof(s32));
3. SO_SNDBUF/ SO_RCVBUF
SO_RCVBUF和SO_SNDBUF每個套接口都有一個發送緩衝區和一個接收緩衝區,使用這兩個套接口選項可以改變缺省緩衝區大小
setsockopt(ptSocket->m_hSocket, SOL_SOCKET, SO_RCVBUF, (s8*)&nBufferSize, sizeof(s32));
setsockopt(ptSocket->m_hSocket, SOL_SOCKET, SO_SNDBUF, (s8*)&nBufferSize, sizeof(s32));
tcp屬性
- TCP_NODELAY TCP/IP協議中針對TCP默認開啓了Nagle算法。Nagle算法通過減少需要傳輸的數據包,來優化網絡。在內核實現中,數據包的發送和接受會先做緩存,分別對應於寫緩存和讀緩存。對於關閉TCP_NODELAY,則是應用了Nagle算法。數據只有在寫緩存中累積到一定量之後,纔會被髮送出去,這樣明顯提高了網絡利用率
打開TCP_NODELAY
int nOn = true;
setsockopt(m_hSocket, IPPROTO_TCP, TCP_NODELAY, (s8*)&nOn, sizeof(s32));
- SO_KEEPALIVE tcp保活機制 同時可以設置另外三個屬性
TCP_KEEPIDLE 多少秒沒有數據開始檢查
TCP_KEEPINTVL發送檢查包的頻率單位秒
TCP_KEEPCNT 發送的次數
設置方法:
setsockopt(m_hSocket, SOL_SOCKET, SO_KEEPALIVE, (s8*)&nYes, sizeof(s32));
linux:
setsockopt(m_hSocket, SOL_TCP, TCP_KEEPIDLE, (void *)&nkeepIdle, sizeof(nkeepIdle));
setsockopt(m_hSocket,SOL_TCP,TCP_KEEPINTVL,(void*)&nkeepInterval,sizeof(nkeepInterval);
setsockopt(m_hSocket, SOL_TCP, TCP_KEEPCNT, (void *)&nkeepCount, sizeof(nkeepCount));
udp屬性:
- SIO_UDP_CONNRESET 設置icmp不處理
Window:
dwOn = false;
ioctlsocket(m_hSocket, SIO_UDP_CONNRESET, &dwOn);