分类: C/C++
2012-06-12 09:28:33
1. 套接字只有处于ESTABLISHED状态,才可以进行数据收发
>client调用connect()成功之后,进入ESTABLISHED状态
>server调用accept()成功后得到的新的描述符,已处于ESTABLISHED状态
2. 数据的收发必须检查返回值
>发送时,数据可能一次发送不完,要循环多次,直到数据全部发送完毕
>接收时,可能需要循环来确保接收到了期望长度的数据
3. 连接断开的检查
>在写数据时,需捕获SIGPIPE信号来检测连接的对方关闭了读端,此时write()/send()调用返回-1,errno设置为EPIPE
>在读书据时,若read()/recv()返回0表示连接的对方关闭了连接
4. 哪端主动断开?
>一般来说,server应控制断开的主动权,否则server会造成DOS(拒绝服务攻击)
5. 解决2MSL问题?
>server需设置SO_REUSEADDR选项,来解决2MSL问题
(Linux不支持SO_REUSEPORT,但其他系统可能需设置该选项)
6. 保持连接问题?
>可以设置SO_KEEPALIVE选项来保持连接,最好应用程序自己做keep alive,这样更稳妥