架构师面试(十六):TCP Socket 编程

问题

今天考察关于 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。

架构师面试(十六):TCP Socket 编程_第1张图片

你可能感兴趣的:(架构师面试,架构师面试,TCP,建立TCP连接问题,从TCP连接中读写数据问题,关闭TCP连接问题,多线程读写TCP连接问题)