SO_REUSEADDR

使得一个 socket 不用再等待前一个 socket 的 TIME_WAIT 状态,而可以直接 bind 同一个地址。

void TcpStream::setSoReuseAddr()
{
    int optval = 1;

    if (setsockopt(sockfd_, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0)
    {
        perror("setsockopt SO_REUSEADDR error");
        exit(-1);
    }
}

TCP_NODELAY

默认会使用 Nagle’s Algorithm,即 TCP_NODELAY 是默认关闭的,这会造成延迟增加,所以需要开启。

void TcpStream::setSoTcpNoDelay()
{
    int optval = 1;

    if (setsockopt(sockfd_, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(optval)) < 0)
    {
        perror("setsockopt TCP_NODELAY error");
        exit(-1);
    }
}

SIGPIPE

忽略 SIGPIPE signal,当向一个已关闭的 socket 写入时,会收到 SIGPIPE signal,默认行为是关闭整个进程,所以要将它忽略。