setsockopt

来源:互联网 发布:网络协议的四层模型 编辑:程序博客网 时间:2024/04/30 22:32

总结一下常见用法,发现没有别人写的好,还是抄吧,出处http://blog.csdn.net/tody_guo/article/details/5972588。

1 closesocket(一般不会立即关闭,需要经历一定的间隔)后想继续使用该套接字。

BOOL bReuseaddr=TRUE;
setsockopt (s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));

2 接上,如果要使得closesocket后立即关闭,不经历等待

BOOL bDontLinger = FALSE;
setsockopt (s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));

3 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));

4 设置发送/接收缓冲度大小

Windows下缓冲区默认8K,如果套接字需要发送的数据大于该值,或者接收的较大,需要循环接收,设置缓冲区大小,可以避免循环,

// 接收缓冲区
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));


5 发送数据时,如果设置发送缓冲区大小为0,期数据不经过缓冲区而直接由协议栈发送数据,听同事说过,没用过,

int nZero=0;
setsockopt (socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));

6 recv同理,不经过接收缓冲区直接到套接字缓冲区。

int nZero=0;
setsockopt (socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));


7. 一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:
BOOL bBroadcast=TRUE;
setsockopt (s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL));



0 0