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

news2025/4/19 4:37:37

问题

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基础学习(4): Batch Norm / Layer Norm / Instance Norm / Group Norm

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1 batch normalization(BN)2 Layer normalization (LN)3 instance normalization (IN)4 group normalization (GN)总结 前言 对 norm/batch/instance/group 这…

Idea集成AI:CodeGeeX开发

当入职新公司,或者调到新项目组进行开发时,需要快速熟悉项目代码 而新的项目代码,可能有很多模块,很多的接口,很复杂的业务逻辑,更加有与之前自己的代码风格不一致的现有复杂代码 更别提很多人写代码不喜…

HTTP HTTPS RSA

推荐阅读 小林coding HTTP篇 文章目录 HTTP 80HTTP 响应码1xx:信息性状态码(Informational)2xx:成功状态码(Success)3xx:重定向状态码(Redirection)4xx:客户端…

【深度学习与大模型基础】第10章-期望、方差和协方差

一、期望 ——————————————————————————————————————————— 1. 期望是什么? 期望(Expectation)可以理解为“长期的平均值”。比如: 掷骰子:一个6面骰子的点数是1~6&#x…

Elasticvue-轻量级Elasticsearch可视化管理工具

Elasticvue一个免费且开源的 Elasticsearch 在线可视化客户端,用于管理 Elasticsearch 集群中的数据,完全支持 Elasticsearch 版本 8.x 和 7.x. 功能特色: 集群概览索引和别名管理分片管理搜索和编辑文档REST 查询快照和存储库管理支持国际…

【python】OpenCV—Tracking(10.6)—People Counting

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数6、参考来自 更多有趣的代码示例,可参考【Programming】 1、功能描述 借助 opencv-python,用 SSD 人形检测模型和质心跟踪方法实现对人群的计数 基于质心的跟踪可以参考 【pyt…

使用KeilAssistant代替keil的UI界面

目录 一、keil Assistant的优势和缺点 二、使用方法 (1)配置keil的路径 (2)导入并使用工程 (3)默认使用keil自带的ARM编译器而非GUN工具链 一、keil Assistant的优势和缺点 在日常学…

FreeRTOS菜鸟入门(五)·空闲任务与阻塞延时的实现

目录 1. 实现空闲任务 1.1 定义空闲任务的栈 1.2 定义空闲任务的任务控制块 1.3 创建空闲任务 2. 实现阻塞延时 2.1 vTaskDelay()函数 2.2 修改 vTaskSwitchContext()函数 3. SysTick 中断服务函数 4. SysTick 初始化函数 通过之前我们了解知道,任…

JBOSS反序列化漏洞解析与防范策略CVE-2017-12149

JBOSS反序列化漏洞解析与防范策略 引言 JBOSS是一个流行的开源应用服务器,广泛应用于企业级应用程序的开发和部署。然而,由于其广泛的使用和复杂的架构,JBOSS也成为了黑客攻击的常见目标。近年来,多个JBOSS漏洞被曝光&#xff0…

Web3技术下数字资产数据保护的实践探索

在这个信息爆炸的时代,数字资产已经成为我们生活中不可或缺的一部分。随着Web3技术的兴起,它以其去中心化、透明性和安全性的特点,为数字资产的管理和保护提供了新的解决方案。本文将探讨Web3技术在数字资产数据保护方面的实践探索&#xff0…

从PPT到PNG:Python实现的高效PPT转图工具

从PPT到PNG:Python实现的高效PPT转图工具 在日常工作中,PPT(PowerPoint)文件是我们常用的演示工具。然而,有时候我们需要将PPT的内容提取为图片格式(如PNG)以便于展示或保存。手动将每一页PPT保…

Rust-引用借用规则

目录 一、概述 二、借用规则 三、详细解释 3.1 第一条规则 3.2 第二条规则 3.3 第三条规则 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [Rust-引用借用规则] ❤博主广交技术好友,喜欢文章的可以关注一下❤ 一、概述 Rust为确保程序在运行时不…

如何保障企业数据的安全?软件开发中的数据安全防护措施

引言 随着数字化转型的推进,数据已经成为企业最重要的资产之一。然而,随着数据量的增长,数据泄露、丢失和滥用的风险也不断增加。如何保障企业数据的安全,成为企业在进行软件开发时必须重点关注的问题。本文将介绍软件开发中的一些…

Linux安装开源版MQTT Broker——EMQX服务器环境从零到一的详细搭建教程

零、EMQX各个版本的区别 EMQX各个版本的功能对比详情https://docs.emqx.com/zh/emqx/latest/getting-started/feature-comparison.html

【软件工程大系】净室软件工程

净室软件工程(Cleanroom Software Engineering)是一种以缺陷预防(正确性验证)为核心的软件开发方法,旨在通过严格的工程规范和数学验证,在开发过程中避免缺陷的产生,而非依赖后期的测试和调试。…

软考 系统架构设计师系列知识点之杂项集萃(49)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(48) 第76题 某文件管理系统在磁盘上建立了位视图(bitmap),记录磁盘的使用情况。若磁盘上物理块的编号依次为:0、1、2、……&#xff1b…

JVM 调优不再难:AI 工具自动生成内存优化方案

在 Java 应用程序的开发与运行过程中,Java 虚拟机(JVM)的性能调优一直是一项极具挑战性的任务,尤其是内存优化方面。不合适的 JVM 内存配置可能会导致应用程序出现性能瓶颈,甚至频繁抛出内存溢出异常,影响业…

封装Tcp Socket

封装Tcp Socket 0. 前言1. Socket.hpp2. 简单的使用介绍 0. 前言 本文中用到的Log.hpp在笔者的历史文章中都有涉及,这里就不再粘贴源码了,学习地址如下:https://blog.csdn.net/weixin_73870552/article/details/145434855?spm1001.2014.3001…

Linux 入门九:Linux 进程间通信

概述 进程间通信(IPC,Inter-Process Communication)是指在不同进程之间传递数据和信息的机制。Linux 提供了多种 IPC 方式,包括管道、信号、信号量、消息队列、共享内存和套接字等。 方式 一、管道(Pipe&#xff09…

Redis之缓存更新策略

缓存更新策略 文章目录 缓存更新策略一、策略对比二、常见的缓存更新策略三、如何选择策略四、实际应用示例五、使用 Cache-Aside TTL 的方式,实现缓存商铺信息详情1.引入StringRedisTemplate2.将查询商铺信息加入缓存3.更新商铺信息时移除缓存总结 六、注意事项 一…