getsockopt 作用
可以获取 socket 缓冲区大小。
int bufsize = 0;
socklen_t optlen = sizeof(bufsize);
getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &bufsize, &optlen); // 获取发送缓冲区的大小。
cout << "send bufsize=" << bufsize << endl;
getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &bufsize, &optlen); // 获取接收缓冲区的大小。
cout << "recv bufsize=" << bufsize << endl;
send 会阻塞吗?
如果发送太快,接受太慢,send 也会被阻塞。
send 之后,立即关闭,能接收到吗?
可以的,因为 send 是把数据写入到内核中的发送缓冲区,就算立即关闭,也能接收到。
nagle 算法
- 在发送一个小于
MSS
长度的包之后,必须收到回复,才能发下一个小包。保证了网络中小包数量得到控制。一般ACK
大概 40ms. - 接收延迟:在接受到一个包之后,会等待 40ms,才会发送
ACK
, 这样可以尽量和应用层的回复数据合一个包。 - 在联机游戏,证券交易等应用场景,时效性要求高,一般会禁用
Nagle
算法。开启TCP_NODELAY
选项。
#include <netinet/tcp.h> // 注意,要包含这个头文件。
int opt = 1;
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY,&opt,sizeof(opt));