不允许对非连接的套接字执行操作_网络那点事儿(4)套接字

两台计算机之间如果要进行通信,则必须有一条数据通道,我们可以把数据通道想象成一条管道。建立管道的关键在于管道的出入口,这些出入口就是套接字。(管道并不真实存在,为了理解可以想象有这么一条管道)服务器会先创建套接字,然后等待客户端向该套接字连接管道。(事实上,服务端和客户端最根本的区别就在于等待连接和发起连接)

这里必须提到客户端收发数据操作的四个阶段,如图一(1)创建套接字阶段(2)连接阶段(就是将管道连接到服务器端的套接字上)(3)通信阶段,也就是收发数据阶段(4)断开阶段。因为本文主要介绍套接字,所以可以顺带就理解了第(1)阶段。

套接字的创建方式比较简单,就是利用Socket库中的socket组件创建,伪代码为<描述符>=socket(<使用IPv4>,<流模式>,…);可以看出就是一个socket函数,参数有协议,流模式等,返回值为描述符。执行了这行代码,就相当于创建了套接字。描述符是操作系统的协议栈返回的,主要是用来识别不同的套接字,因为会有多个通信操作需要委托操作系统的协议栈创建套接字,(比如两个浏览器访问Web服务器,我们可能同时打开两个浏览器窗口,访问两台web server)所以通过描述符来区分,类似于在酒店前台寄存行李,前台人员给你一个号码牌。

接下来,我们需要了解一下套接字的真正内容,套接字其实是通信控制信息。大家应该都知道操作系统的五大功能(进程管理,CPU调度,内存管理,设备管理,文件管理)之一就是内存管理。操作系统的协议栈内部其实有一块用于存放控制信息的内存空间,记录着用于控制通信操作的控制信息,比如IP地址,端口号,通信操作的状态等等。就客户端应用程序而言它就只是一个概念,但是如果要赋予它一个实体,那么就是存放控制信息的内存空间。我们调用上述伪代码的时候,操作系统帮我们分配了一个用于存放套接字控制信息的内存空间,并赋初始状态。(想起了第一节C语言课的时候,老师说你知道你一个“ int i=0;”计算机帮你做了多少事儿嘛 )它存放的控制信息包括通信对象的IP,端口号,执行数据发送后多久了,是否已经收到响应等。协议栈是利用这些信息判断下一步的行动的,这就是套接字的作用。就是酱紫啦,真的很抽象,虽然没有操作系统抽象,但是已经让我很懵逼了。

书上给了个例子,Windows操作系统下,用命令netstat -ano 可以下面是套接字的内容。(如图二)

补充:Socket 首字母大写,一般说的是Socket库,socket 首字母小写,一般说的是Socket库中的socket组件

图一

32be79b01e0eb1bd743645c202141f9d.png

图二

c52f755c300b59a8b4f89ca1cc9b18d1.png

Over

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值