问题
今天考察关于 Socket 的 TCP 网络编程的基础知识。
我们知道 TCP 是基于连接的端到端的有序的可靠的数据流式传输协议,TCP 编程其实是围绕着【TCP连接】进行的,我们把常见的 TCP 编程需要注意或需要解决的问题划分为五类,大家可以思考一下遇到以下五类问题中的每种情况时,会出现什么现象或者我们应该采取什么样的措施呢?
一、建立连接问题
(1)连接拒绝
(2)listen backlog 满
(3)网络延迟较大
二、从连接中读数据问题
(1)无数据可读
(2)数据不足(没有读取到完整的数据包)
(3)读超时
三、向连接写数据问题
(1)写阻塞
(2)只写入了部分数据
四、多线程读写安全问题
(1)多线程读一个 socket
(2)多线程写一个 socket
五、关闭连接问题
(1)自己关闭 socket 后自己继续写数据
(2)自己关闭 socket 后自己继续读数据
(3)对方关闭 socket 后自己继续写数据
(4)对方关闭 socket 后自己继续读数据
参考答案
一、建立连接问题
(1)连接拒绝: 网络ping不通;ip 或port 指定错误;server 未启动;
(2)listen backlog满:增大server端 listen backlog 队列;耐心等 server 端接受;
(3)网络延迟较大:client 端超时处理;重连。
二、从连接中读数据问题
(1)无数据可读:阻塞read即可,直到有数据可读或 socket 连接断开时发生读错误;
(2)数据不足(没有读取到完整的数据包):TCP是流式数据传输协议,继续读即可;
(3)读超时:会有这种情况吗?(除非上层业务添加超时参数)
三、向连接写数据问题
(1)写阻塞:本地缓冲区或对方缓冲区已满,继续阻塞写即可;
(2)只写入部分数据:TCP 是流式数据传输协议,继续写即可(同数据不足)。
四、多线程读写安全问题
(1)多线程读一个socket:有序下车,不能乱(lock),每个线程读完一个完整的数据包后再走;
(2)多线程写一个socket:有序上车,不要乱(lock),每个线程写完一个完整的数据包后再走。
五、关闭连接问题
(1)自己关闭 socket 后自己继续写数据 :use of closed network connection;自己关闭了连接,就不要继续读写了;
(2)自己关闭 socket 后自己继续读数据:use of closed network connection;自己关闭了连接,就不要继续读写了;
(3)对方关闭 socket 后自己继续写数据:可能写一部分,然后:An existing connection was forcibly closed by the remote host;
(4)对方关闭 socket 后自己继续读数据:缓冲区的数据先全部读出来,然后碰到 EOF。