连接建立阶段
- 套接字选项配置
- TCP_NODELAY:启用
TCP_NODELAY
选项,通过设置sockopt
为1来关闭Nagle算法。这能避免小包数据的延迟发送,在高并发场景下及时将数据发送出去,提升传输效率。示例代码:
int flag = 1;
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));
- **SO_RCVTIMEO**和**SO_SNDTIMEO**:可根据业务需求设置接收和发送超时时间。例如,设置接收超时时间为5秒:
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));
- 异常情况及处理策略
- 连接超时:若连接长时间未建立成功,可通过设置的
SO_SNDTIMEO
来判断是否超时。若超时,可尝试重新连接,或者提示用户网络连接可能存在问题。
- 资源耗尽:在创建套接字或连接时可能出现资源不足的情况(如文件描述符耗尽)。可通过监控系统资源(如
ulimit -n
查看文件描述符限制),并在程序中合理管理文件描述符,及时关闭不再使用的套接字。
数据收发阶段
- 套接字选项配置
- TCP_NODELAY:保持启用状态,持续保证数据的及时发送。
- SO_RCVBUF和SO_SNDBUF:适当增大接收和发送缓冲区大小,以满足大量数据传输需求。例如,将接收缓冲区增大到32KB:
int rcvbuf = 32 * 1024;
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf));
- 异常情况及处理策略
- 网络中断:在数据收发过程中,网络可能中断。可通过
send
或recv
函数的返回值判断,若返回 -1且errno
为EAGAIN
或EWOULDBLOCK
,表示当前缓冲区已满或为空,可再次尝试;若为其他错误码(如ECONNRESET
表示连接被对方重置),则需要重新建立连接。
- 连接超时:在接收数据时,若设置了
SO_RCVTIMEO
,超时后recv
函数将返回 -1且errno
为EAGAIN
或EWOULDBLOCK
,可选择再次尝试接收或放弃当前数据块的接收,并通知上层应用。
- 资源耗尽:缓冲区满时,
send
函数返回 -1且errno
为EAGAIN
或EWOULDBLOCK
,此时可等待一段时间后再次尝试发送,或者调整发送策略(如减小单次发送的数据量)。
连接关闭阶段
- 套接字选项配置
通常无需特别配置新的套接字选项,但建议使用
shutdown
函数而非close
函数来优雅关闭连接,这样能保证数据的正常发送完毕。示例:
shutdown(sockfd, SHUT_RDWR);
- 异常情况及处理策略
- 数据未发送完毕:若在关闭连接时发现仍有数据未发送,可在
shutdown
之前先检查发送缓冲区状态,若有未发送数据,可尝试再次发送,直到数据全部发送完毕或达到重试次数上限。
- 连接未正常关闭:若
shutdown
或close
函数返回错误,需要检查错误码(如EBADF
表示无效的文件描述符),根据错误情况进行相应处理,例如重新尝试关闭操作或释放相关资源。