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