前言

以前也整理过吧,写了几篇之后,感觉没啥整理的必要了然后就放弃了,最近又想整理一下。

正文

这篇对应的是:https://www.cnblogs.com/aoximin/p/12235333.html,可以说是这篇的重写吧。

首先介绍一下什么是socket的,如果搞学术的不知道,他们可能要求的比较严,但是对于码农来说,socket可以说是向操作系统申请网络资源。

这个资源可以让我们发送数据和接收数据,这样就可以了。就像我们上面那篇文章写的,操作系统就是服务端,我们写的都是客户端,我们做的就是和服务端打交道。

如果真的想了解这个socket,那么应该去了解操作系统,如果是了解网络,初学的话,那大可不必。

就跟前后端一样,后端告诉你一个token,然后前端总纠结这个token是啥,我觉得大可不必,你传给我服务端我就给你过呗。

有时候我们要放大我们的思维,有时候我们要缩小自己的思维。 如果从客户端的角度去考虑socket,就跟前端去考虑token 是一样的,又痛苦又无趣。当你花点时间去了解后端,这个问题自然就解了。天生万物,道法自然,一切都是机缘,不要强求。

现在了解了,socket 就是资源。

有了操作系统给我们的socket 的资源后,我们就可以做一些其他事情了。

比如我们告诉操作系统,我们要占用127.0.0.1 的 8888 端口。

那么我们可以使用bind 来告诉操作系统。以前我有个误区,就是一只理解bind为绑定的意思,后面我理解的是应该是申请的意思。

要申请这个127.0.0.1 8888这个资源。所以如果有一个程序申请了这个资源,其他程序就不能申请了。

通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

但是我们知道,这个返回的socket 是个描述符,假如我们的这个描述符给其他程序使用,那么是否能共享这个资源呢?

如果这个成立,那么一切都回到了资源这个话题,而不能再说什么占用的情况,什么程序之间不能公用一个网络的情况。

这个后面提及,不然一直往外推,就太大了。

现在回到了socket这个话题了。bind 申请了这个套接字占用了某个网络资源了。

那么为何我们要进行listen呢? bind 是资源占用,现在操作系统记录了这个网络资源属于某个socket了,其他socket就不能占用了。

但是有个问题,就是占用相当于操作系统内部的操作。操作系统可没有说要处理收到的消息啊。

操作系统处理消息相当于流水线,消息过来了,但是我们的指挥部还没要处理到127.0.0.1 8888地址的消息啊。

那么listen 就是告诉流水线,处理一下127.0.0.1 8888的消息,有到这个的地址的包裹存一下。

那么现在流水线上的资源会被存起来了,但是这个是存到了操作系统了,还没到我们的程序。

这个时候客户端程序已经可以发送连接和消息到我们作为服务器申请了127.0.0.1 8888的这台机器了。

前面说了包裹还在我们操作系统那里,那么就得问一下(accept),有没有人发包裹给我。

然后操作系统如果有的话,就会告诉隔壁家的大爷发了点东西给你。

这个时候你就会拿到客户端会话,然后给操作系统说接受一下(receive)包裹吧。

这个时候我们思考一下问题,那就是tcp是双向通信的,这个时候我要收大爷包裹的时候,突然大爷掉线了,tcp断了。

请问这个时候操作系统还会给我包裹吗?

远程主机强迫关闭了一个现有的连接。

这时候你就会收到上面这个,这个时候操作系统就不给你缓存的包裹了,至于操作系统啥时候清空缓存这是操作系统干的事情。

这个时候再思考另外一个问题,如果是大爷发了包裹给我,然后又断开了。这个时候我们才开始进行accept,操作系统还会告诉我们大爷给过包裹吗?

是会的,来电显示还是会给的。

这大概就是基本的tcp 通信了。

自己写的测试代码 .net 6:

service:

  1. // See https://aka.ms/new-console-template for more information
  2. using System.Net;
  3. using System.Net.Sockets;
  4. var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  5. var ipAddress = IPAddress.Parse("127.0.0.1");
  6. EndPoint endPoint = new IPEndPoint(ipAddress, 8888);
  7. socket.Bind(endPoint);
  8. socket.Listen();
  9. Console.ReadLine();
  10. var clientSocket = socket.Accept();
  11. var receiveMessage = new Byte[1000];
  12. clientSocket.Receive(receiveMessage);
  13. Console.WriteLine(System.Text.Encoding.UTF8.GetString(receiveMessage));
  14. Console.ReadLine();

client:

  1. // See https://aka.ms/new-console-template for more information
  2. using System.Net;
  3. using System.Net.Sockets;
  4. var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  5. var ipAddress = IPAddress.Parse("127.0.0.1");
  6. EndPoint endPoint = new IPEndPoint(ipAddress, 8888);
  7. socket.Connect(endPoint);
  8. socket.Send(System.Text.Encoding.UTF8.GetBytes("hello service"));
  9. Console.ReadLine();

以上只是个人理解,可能存在错误,望请指出。

计算机网络再次整理————socket[一]的更多相关文章

  1. 计算机网络再次整理————tcp周边[八]

    前言 tcp的包的格式可以看我以前的计算机网络整理,下面这些周边只是为了开发时候我们能用到一些理论知识. 正文 首先要介绍的就是域名,为啥有域名这东西呢?单纯站在网络的角度上讲这属于应用层的东西了. ...

  2. 计算机网络再次整理————tcp例子第二前奏[四]

    前言 前文我们介绍了网络协议的各层,同时也介绍了一下我们在编写代码时候的服务端的accept.bind.listen.connect.send做了什么. 可以说是从宏观的角度,或者代码开发的角度来说的 ...

  3. 计算机网络再次整理————tcp例子[五]

    前言 本文介绍一些tcp的例子,然后不断完善一下. 正文 服务端: // See https://aka.ms/new-console-template for more information us ...

  4. 计算机网络再次整理————tcp的关闭[七]

    前言 tcp的关闭不是简单粗暴的,相对而言是友好优雅的,好聚好散吧. 那么友好的关闭方式是这样的: 假设这里是客户端请求关闭的,服务端倒过来. 客户端:我要请求关闭 服务端:我接收到你的请求了,等我把 ...

  5. 计算机网络再次整理————tcp[二]

    前言 本文不会去介绍tcp的具体协议,因为这个tcp 应该不能说是单纯的连接和传输数据这么简单,里面还有很多机制. 正文 首先介绍一下什么是协议族(protocal Family),举个例子PF_IN ...

  6. 计算机网络再次整理————UDP例子[六]

    前言 简单的说,UDP 没有 TCP 用的广泛,但是还有很多是基于UDP的程序的,故而简单介绍一下. 正文 秉承节约脑容量的问题,只做简单的介绍和例子,因为自己几乎也没怎么用过UDP. 只是了解和知晓 ...

  7. 计算机网络再次整理————tcp例子前奏[三]

    前言 简单编写一下tcp例子. 正文 我们常说IOS有7层,实际上也只有4层,或者这样说简单的说是4层. 首先是数据链路层,首先这一层解决了什么问题呢?为什么要有这一层呢? 首先要抛开有操作系统的意识 ...

  8. 大前端学习笔记【七】关于CSS再次整理

    如果你在日常工作中使用 CSS,你的主要目标可能会重点围绕着使事情“看起来正确”.如何实现这一点经常是远不如最终结果那么重要.这意味着比起正确的语法和视觉结果来说,我们更少关心 CSS 的工作原理. ...

  9. 计算机网络|C语言Socket编程,实现两个程序间的通信

    C语言Socket编程,实现两个程序间的通信 server和client通信流程图 在mooc上找到的,使用Socket客户端client和服务端server通信的流程图

随机推荐

  1. E. Congruence Equation

    E. Congruence Equation 思路: 中国剩余定理 \(a^n(modp) = a^{nmod(p-1)}(modp)\),那么枚举在\([0,n-2]\)枚举指数 求\(a^i\)关 ...

  2. 关于python常用的命令

    os模块: os.system os.system("cat/cmd等...") os.popen print os.popen("adb shell ls ../aa. ...

  3. mod4最优路径问题(转载)

    原文链接:https://blog.csdn.net/ACdreamers/article/details/18501855 mod4最优路径问题 如下图: 从1到4找出一条路径,要求路径的总长度mo ...

  4. Exploring Architectural Ingredients of Adversarially Robust Deep Neural Networks

    目录 概 主要内容 深度 宽度 代码 Huang H., Wang Y., Erfani S., Gu Q., Bailey J. and Ma X. Exploring architectural ...

  5. ELBO surgery: yet another way to carve up the variational evidence lower bound

    目录 概 主要内容 Evidence minus posterior KL Average negative energy plus entropy Average term-by-term reco ...

  6. 使用 Eclipse 创建一个静态的登录页面

    要求: 使用 Eclipse 创建一个静态的登录页面 实现步骤: 在 Eclipse 中,点击"File",显示菜单,选择"New" "Other&q ...

  7. 编写Java程序,使用Swing事件处理机制实现用户登录和英雄信息显示

    返回本章节 返回作业目录 需求说明: 使用Swing事件处理机制实现用户登录和英雄信息显示 实现思路: 创建LoginView类,该类用于显示登录界面,为登录按钮添加ActionListener事件, ...

  8. 面试中问你MySql,这一篇就够了

    说一说主键索引与唯一索引 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键索引默认是聚簇索引.唯一索引一般是非聚簇索引. 主键索引不能为空,唯一索引在InnoDB中可以出现多个null ...

  9. playwright--自动化(二):过滑块验证码 验证码缺口识别

    前两天需要自动化登录一个商城的后台 用的是playwright 没有用selenium 中间出了一个滑块验证 现阶段playwright教程不是太多,自己做移动的时候各种找,费劲巴拉的.现在自己整出来 ...

  10. iNeuOS工业互联网操作系统,增加DTU与平台实时交互的应用场景

    目       录 1.      概述... 2 2.      平台演示... 2 3.      硬件设置... 2 4.      应用过程... 3 1.   概述 DTU向下连接硬件传感器 ...