用法
BOOL bReuseaddr = TRUE;
setsockopt(s,SOL_SOCKET,
SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));
⒉ 若是要已經處於鏈接狀態的soket在調用close
socket()後強制關閉,不經歷TIME_WAIT的過程:
BOOL bDontLinger = FALSE;
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));
⒊在
send(),recv()過程當中有時因爲網絡情況等緣由,收發不能預期進行,能夠設置收發時限:
int nNetTimeout = 1000; //1秒
//發送時限
setsockopt(
socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//接收時限
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
⒋在
send()的時候,返回的是實際發送出去的字節(同步)或發送到
socket
緩衝區的字節(異步);系統默認的狀態發送和接收一次爲8688字節(約
爲8.5K);在實際的過程當中若是發送或是接收的數據量比較大,能夠設置
socket
緩衝區,避免
send(),recv()不斷的循環收發:
int nRecvBuf = 32 * 1024; //設置爲32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
int nSendBuf = 32*1024; //設置爲32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
int nZero = 0;
setsockopt(socket,SOL_SOCKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));
int nZero = 0;
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(char *)&nZero,sizeof(int));
BOOL bBroadcast = TRUE;
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL));
有在非阻塞的過程當中有顯著的做用,在阻塞的
函數調用中做用不大)
BOOL bConditionalAccept = TRUE;
setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)&bConditionalAccept,sizeof(BOOL));
據將會丟失。
某些具體程序要求待未發送完的數據發送出去後再關閉
socket,可經過設置讓程序知足要求:
1 struct linger {
2 u_short l_onoff;
3 u_short l_linger;
4 };
5 linger m_sLinger;
6 m_sLinger.l_onoff = 1;
7 //在調用closesocket()時還有數據未發送完,容許等待
8 //若m_sLinger.l_onoff=0;則調用closesocket()後強制關閉
9 m_sLinger.l_linger = 5; //設置等待時間爲5秒
10 setsockopt(s, SOL_SOCKET, SO_LINGER,
11 (const char*)&m_sLinger,sizeof(linger));