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

参考

TCP缓存