socket 编程到底该怎么学?

2023-12-05

通俗地说就是套接字编程,就是使用操作系统提供的一种叫“套接字”的东西,让相同或者不同的机器上的不同进程可以通过网络交互数据。

我建议你这么学:

一、学习方法与内容

1 计算机网络理论知识

你需要掌握基础的如三次握手和四次挥手的过程以及各个状态值,我建议使用 tcpdump 命令实际抓下包就一目了然了,然后就是网络分层,各层的用途,重点熟悉下 TCP/IP 层相关的知识,还有就是 TCP/UDP 的区别,TCP 的滑动窗口机制、拥塞控制算法、TCP 的保序、重传、确认机制。

学习这些知识的时候,一定不要死记硬背,注重理解。我近来面试了一部分学历学校非常好的同学,然而,在问到这块的知识时却大失所望。例如,有的同学只是单纯把三次握手背下来了,我稍微变通一下他就不知道怎么回答了:

1. 如果连接一个目标主机不存在的 IP 地址握手过程是怎样的?连接一个目标 IP 存在但是端口号不存在的主机又是怎样的握手过程呢? 2. A 机器上的进程与 B 机器上的进程进行网络通信,分别经历了哪些网络层。

2 Socket 编程本身

Socket 编程你需要先掌握常用的 Socket API,包括但不局限于:

常用 Berkeley Sockets API 一览表

学习这些 Socket API 的时候,不是让你单纯地记忆这些函数的参数,而是掌握每一个函数的重难点。

例如:

1. 如何将一个 socket 设置成非阻塞模式 2. 阻塞模式下,send 和 recv 函数行为是什么样子的?非阻塞模式下 send/recv 的返回值分别是什么? 3. 客户端发起连接时,如何主动指定通过本地某个端口号去连接?bind 函数如果端口号设置为 0 是什么行为? 4. listen 函数的 backlog 参数用途是什么? 5. 如何实现异步的 connect 函数? 6. accept 函数调用时,三次握手是否已经完成? 7. 如何实现半关闭状态? 8. nagle 算法的用途是什么? 9. select 函数的第一个参数怎么设置?select 函数的超时参数如果设置为 NULL 是什么行为?

接着要重点学习下常用的网络模型:

1. Windows 上常用的网络模型有 select、WSAEventSelect、WSAAsyncSelect、完成端口模型;

2. Linux 上常用的网络模型 select、poll、epoll,epoll 需要重点关注的是水平模式和边缘模式。

当然,也建议一定要理解,不要死记硬背。C++ 的同学来面试的时候,我会给他们准备如下面试题:

1. epoll 边缘模式下,某次读取了某个 socket 上的部分数据,下次是否会出发读事件?如果此时又来了一个字节的新数据,是否会触发读事件? 2. epoll 边缘模式建议尽量一次把数据读完,怎样判断当前数据已经读完? 3. epoll 边缘模式下,对于写事件应该如何处理?

接着还要熟悉 TCP 协议的流式特性,如何解决粘包问题;还要掌握常见的网络协议格式,像 HTTP、FTP、POP3/SMTP/WebSocket协议的格式都建议熟练掌握。

以 HTTP 协议为例,HTTP 协议包的格式是什么样的,包头和包体如何分界的,GET 与 POST 请求的数据分别放在 HTTP 包的什么位置,如果放在包体中,如何知道包体的数据有多长。

3 常用网络命令

学习了常用的网络命令,可以用来排查网络故障与定位问题,反过来,也可以加深对网络理论知识的理解,建议掌握以下命令:ifconfig、ping、telnet、netstat、lsof、nc、curl、tcpdump。

掌握了这些命令要做到学以致用,例如现在某个服务器连接不上,如何使用这些命令判断是自己网络的问题还是目标主机的问题;开发了一个服务器程序,手头上没有可用的客户端,如何使用 nc 命令模拟一个;或者反过来,开发了一个客户端程序,如果用 nc 模拟一个服务器端用于测试。

4. 如果你对 TCP 源码感兴趣,可以看这里:

二、推荐的书籍

  1. 我在我自己的《 C++ 服务器开发精髓 》一书第四章详细地总结了网络编程的二十多个重难点知识,他们可以帮你搞清楚了百分之九十以上的 socket 编程问题,在该书的第五章详细地介绍了ifconfig、ping、telnet、netstat、lsof、nc、curl、tcpdump 这些网络的用户,推荐一下。

2. 计算机网络理论的书推荐《计算机网络:自顶向下方法》

链接: https://pan.baidu.com/s/1XMB4tTT1lwHWkNdk9VgPpQ 提取码: k4hq

3. 网络编程方面的实战书来,我推荐韩国人尹圣雨写的这本《TCP/IP 网络编程》,这本书也适合无任何 Socket API 编程经验的小白,这本书涵盖从基础的 Socket API 到高级的 IO 网络模型,有非常详细和生动的例子。

链接: https://pan.baidu.com/s/1ho3e1POq5LzEQWp0Gm2Nsg 提取码: sp8p

4. 等你有了一定的网络编程以后(熟练使用常见 Socket API),你可以看看游双的《Linux 高性能服务器编程》(链接: https://pan.baidu.com/s/1f9IErU5JP2sw-5Crha9vzg 提取码: je7g ),这本书给没有基础的人或者基础不扎实的人的感觉是,尤其是书的前三章,这书怎么这么垃圾,又把网络理论书上面的东西搬过来凑字数,但是如果你有基础再按照书上的步骤在机器上实践一遍,你会发现,真是一本难得的、良心的书,桃李不言下自成蹊吧。如果你掌握了这本书上说的这些知识,你再看陈硕老师的《Linux 多线程服务端编程》或者去看像 libevent 这样的开源网络库,你会进一步的得到提升。

完整的书单在这里:

计算机必看经典书籍(含下载方式)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

socket 编程到底该怎么学? 的相关文章

  • 计算机毕业设计选题推荐-SpringBoot 桂林旅游景点导游平台

    作者主页 疯狂行者 java领域优质创作者 专注于Java技术领域技术交流 文末获取源码 精彩专栏推荐订阅 在 下方专栏 Java精彩实战项目案例 Java精彩新手项目案例 Python精彩新手项目案例 文章目录 Java精彩实战项目案例
  • java高校学生实习管理系统springboot+vue

    高校学生实习管理系统管理员 学生 教师 管理员功能有个人中心 学生管理 教师管理 公告信息管理 实习申请管理 实习信息管理 实习成绩管理 学生可以注册 可以实习申请 查看公告信息 查看实习成绩 教师给学生添加实习成绩 审核学生实习申请 查看
  • C++ 游戏服务器方向需要多少功底?

    这篇文章是回答一位知友的提问 现在大二了马上升大三 就读于一个很垫底的211 专业是计算机相关的 但是对本专业内容不感兴趣 希望能从事c 后端的工作 对游戏比较有兴趣 但又不知道需要哪方面的知识 希望各位能给出一个客观的评价或者批评 帮忙指
  • C/C++ 函数调用是如何实现的?

    一 写在前面的话 C C 函数调用方式与栈原理是 C C 开发必须要掌握的基础知识 也是高级技术岗位面试中高频题 我真的真的真的建议无论是使用 C C 的学生还是广大 C C 开发者 都该掌握此回答中所介绍的知识 如果你看不懂接下来第二部分
  • Nodejs+vue+elementui+mysql酒店宾馆客房预订管理系统479v8

    对一个宾馆而言 一个良好的管理系统就等于优质的服务 赚钱的工具 为宾馆的发展带来光明的前景 模块介绍 1 用户注册与登录模块 员工和管理员注册与登录 个人信息修改等 2 个人中心模块 对个人信息进行修改添加等 3 员工管理模块 添加 修改员
  • 基于java的高校教职工档案管理系统springboot+jsp

    一 拟解决的关键问题 1 登陆模块 该模块对档案管理系统设定登录约束 并在该模块对档案系统登录用户进行权限分配 2 档案收集模块 对各类档案材料进行录入和入库 数据库 主要包括学历档案信息 工作经历档案信息 职称档案信息 职务信息档案 表彰

随机推荐

  • python+django民俗风俗习惯传统文化网站pycharm毕业设计

    1 所有记录信息要保持全面 信息记录内容不可以是空 2 各种数据间相互联系要保持正确 3 相同数据在不同记录中要保持一致 传统文化如果还用之前的只有线下进行黑板报形式的去实行 已经很落伍了 这样会导致了效率低下 而且 时间一长的话 积累下来
  • 计算机毕业设计python+django家庭养老服务管理系统vr18o

    快本居家养老系统管理员和工作人员两个角色 管理员功能有个人中心 老人账号管理 工作人员管理 老人档案管理 订单申请管理 检查检验项目管理 维修服务管理 订单信息管理 转诊信息管理 生活服务管理 服务记录管理 生活用品信息管理 药品信息管理
  • 基于Android的旅游服务APP系统

    收藏关注不迷路 源码文章末 文章目录 前言 一 项目介绍 二 开发环境 三 功能介绍 四 核心代码 五 效果图 六 文章目录 前言 本Android的旅游服务APP是根据当前我国旅游的大环境相关的内容实际情况开发的 在系统语言选择上我们使用
  • nodejs微信小程序+python+PHP健身房信息管理系统的设计与实现-计算机毕业设计推荐

    目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1 1背景及意义 1 1 2 国内外研究概况 1 1 3 研究的内容 1 第2章 相关技术 3 2 1 nodejs简介 4 2 2 express框架介绍 6 2
  • 计算机毕业设计推荐之java网上购物商城系统sringboot+vue_o9m4k

    系统使用过程主要涉及到管理员和用户两种角色 主要包含个人中心 用户管理 商品类别管理 热卖商品管理 投诉建议 系统管理 订单管理等功能 系统开发主要在 Windows 系统下进行 采用支持跨平台的 Java语言开发完成 因此可以运行在任意开
  • 大一大二的计算机专业同学应该学习什么?如何学习?

    本文是回答一位知友的提问 已经大一下了 现在在学 C 感觉书上很多术语都不懂 编程自己也得花很多时间才能做出来 但感觉自己身边的同学却什么都会 有什么好的建议吗 我一定努力改正 正文 一 可能的原因 调整心态 克服恐惧和畏难情绪 建议反思一
  • 前后端分离vscode+mysql校园报修维修管理系统nodejs+vue

    本基于nodejs的学校智能网上报修管理系统是根据当前高校网上报修相关的内容实际情况开发的 在系统语言选择上我们使用的nodejs语言 数据库是小巧灵活的MySQL数据库 本系统的开发可以极大的提高学校智能网上报修管理系统的管理效率 开发语
  • nodejs+vue+elementui电子数码产品商城推荐系统vscode毕业设计

    基于vue的电子产品推荐系统分为前台和后台两部 前台部分主要是让用户购买和查看商品使用的 后台主要是让管理员人员发布商品相关信息和管理订单使用的 前台部分包括用户注册登录 查看商品相关信息 查看公告信息 查看热卖产品 查看精品产品 将商品加
  • 基于springboot洗衣店管理系统

    收藏关注不迷路 源码文章末 文章目录 一 项目介绍 二 开发环境 三 功能介绍 四 核心代码 五 效果图 六 文章目录 一 项目介绍 本基于springboot洗衣店管理系统是根据当前洗衣店和用户的实际情况开发的 在系统语言选择上我们使用的
  • css设置渐变色

    css如何设置自定义渐变色 线性渐变篇 CSS渐变可以让你在两个或多个指定颜色之间显示平滑的过渡 CSS定义了三种渐变类型 Linear Gradients goes down up left right diagonally 下降 上升
  • python+django基于hadoop大数据的学习资源推送系统的设计与实现vue

    考虑到实际生活中在学习资源推送管理方面的需要以及对该系统认真的分析 将系统按权限进行划分 管理员登入使用本系统涉到的功能主要有个人中心 用户管理 学习视频管理 学习类型管理 系统管理等功能 管理员用例如图3 1所示 图3 1 管理员用例图
  • springboot+jsp高校大学生心理咨询系统

    1 课题目的及意义 随着全球化的发展 各国对高等素质的人才需求越来越大 培养高素质的人才 顺应世界的需求 就要求高校培养的不单单是德智体美劳德人才 还需要心理健康的人才 加强大学生心理素质教育是时代发展的需要 也是中国高等教育改革的需要 近
  • 基于java的可视化高校学生宿舍公寓管理系统springboot+vue

    实现了用户在线选择试题并完成答题 在线查看考核分数 管理员管理班级管理 每日打卡管理 字典管理 访客管理 宿舍缴费记录管理 离校登记管理 宿舍管理 宿舍管理员管理 物品进出登记管理 学生管理 住宿信息管理 管理员管理等功能 管理员功能 1
  • 单个 epoll + 线程池与每个线程一个 epoll 这两种架构哪个更适合大量短连接的场景?

    本文是回答一位知友的提问 单个 epoll 线程池与每个线程一个 epoll 这两种架构哪个更适合大量短连接的场景 不少教程上都提到线程池适合大量的网络短连接的任务场景 但我总感觉这个优势有点站不住脚 单 epoll 线程池模型 主要考虑到
  • 如何系统学习 MySQL?

    一 不建议这么学数据库 首先你要消除一个错误认知 即 如果你想系统地掌握数据库常用的知识点 一定不要以网上各种散乱的文章为重点学习材料 理由有二 网上的资料碎片化比较严重 对于新人来说 可能会造成盲人摸象的感觉 无法形成这块成体系的技术认知
  • nodejs+Vue+elementUI选校园招聘求职网站系统zr299

    从技术实现来讲 可以分为前端技术和后端技术 1 前端技术主要使用vue框架 使用vantUI elementUI搭建前端页面 页面精美 方便快速 2 后端主要使用nodejs 前端通过使用ajax调用接口 进行数据交互 服务器端 数据的存储
  • nodejs+vue+elementui付费自习室座位选座系统-高校教室管理系统nl1u1

    开发语言 node js 框架 Express 技术栈 nodejs vue elementui express 数据库 mysql 数据库工具 Navicat 二 研究方法 1 文献研究法 通过各个文献查找网站 学校图书馆以及百度百科查询
  • python基于django的在线教育学习网站n5138

    在开发系统的过程中 本人运用到vue技术和平时学习中所了解的一些技术 通过实现这些技术 大大提高了整个系统的性能 在论文中这些技术都做了比较详细的介绍 本系统还存在很多缺点和不完善的地方 例如有些细节上做的还不够完善 有些功能模块还需要加强
  • 学习C++,应该循序渐进的看哪些书?

    C C 这门语言与其他高级语言不同 它是离操作系统较近的语言 所以学好 C C 体系的技术栈必须结合操作系统的运行机制来学习 展开来说 就是你必须掌握操作系统层面的几大基础知识 他们是汇编 编译链接与运行时体系 狭义的操作系统原理 多线程
  • socket 编程到底该怎么学?

    通俗地说就是套接字编程 就是使用操作系统提供的一种叫 套接字 的东西 让相同或者不同的机器上的不同进程可以通过网络交互数据 我建议你这么学 一 学习方法与内容 1 计算机网络理论知识 你需要掌握基础的如三次握手和四次挥手的过程以及各个状态值