用法
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));