问题
今天考察网络编程的基础知识。
在基于 TCP 协议的网络 【socket 编程】中可能会遇到很多异常,在下面的相关描述中说法正确的有哪几项呢?
A. 在建立连接被拒绝时,有可能是因为网络不通或地址错误或 server 端对应端口未被监听;
B. 在对 socket 连接执行读写操作时,如果一个数据包没有被完整读出或完整写入,继续进行读写操作即可,除非连接已经断开;
C. 如果对方关闭了 socket 连接,我们是可以继续对 socket 进行读操作的,直至读完最后一个字节,也可以继续对 socket 进行写操作,直至碰到错误异常;
D. 当自己关闭了 socket 连接,如果继续读或写时,会发生 “use of closed network connection” 错误。
解析
对 TCP 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。
这五大类问题,笔者都曾通过Go语言 一 一 验证过;深入理解常见的TCP Socket 编程问题,可以大大夯实我们的网络编程能力,能为我们后续学习分布式奠定基础!
参考答案
ABCD