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

发布于:2025-04-15 ⋅ 阅读:(92) ⋅ 点赞:(0)

问题

今天考察网络编程的基础知识。

在基于 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


网站公告

今日签到

点亮在社区的每一天
去签到