setsockopt的一些用法:
close socket(一般不会当即封闭而阅历TIME_WAIT的进程)后想持续重用该socket:
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_S0CKET,SO_SNDTIMEO,(char *)nNetTimeout,sizeof(int)); //接纳时限 setsockopt(socket,SOL_S0CKET,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));
假如在发送数据的时,期望不阅历由体系缓冲区到socket缓冲区的复制而影响程序的功用:
int nZero=0; setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)nZero,sizeof(nZero));
同上在recv()完结上述功用(默许状况是将socket缓冲区的内容复制到体系缓冲区):
int nZero=0; setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)nZero,sizeof(int));
一般在发送UDP数据报的时分,期望该socket发送的数据具有播送特性:
BOOL bBroadcast=TRUE; setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)bBroadcast,sizeof(BOOL));
在client衔接服务器进程中,假如处于非堵塞形式下的socket在connect()的进程中能够设置connect()延时,直到accept()被呼叫(本函数设置只要在非堵塞的进程中有明显的效果,在堵塞的函数调用中效果不大)
BOOL bConditionalAccept=TRUE; setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)bConditionalAccept,sizeof(BOOL));
假如在发送数据的进程中(send()没有完结,还有数据没发送)而调用了close socket(),曾经咱们一般采纳的办法是沉着封闭shutdown(s,SD_BOTH),可是数据是必定丢掉了,怎么设置让程序满意详细使用的要求(即让没发完的数据发送出去后在封闭socket)
struct linger { u_short l_onoff; u_short l_linger; }; linger m_sLinger; m_sLinger.l_onoff=1;//(在closesocket()调用,可是还有数据没发送结束的时分容许停留) // 假如m_sLinger.l_onoff=0;则功用和2.)效果相同; m_sLinger.l_linger=5;//(容许停留的时刻为5秒) setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)m_sLinger,sizeof(linger));