架构师面试(十六):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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值