Linux 网络编程-基础篇-网络编程时要做的三件事
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,默认行为是关闭整个进程,所以要将它忽略。