当前课程知识点:互联网体系结构 > 第二周:Socket网络编程 > Socket接口 > Video
具体来看一下这些函数和指针函数呢
一般有有这么几个socket对吧
这个是创建一个套接字,主动套接字会连接服务器
也就在服务器上需要绑定端口号
绑定地址和端口号啊
就是开放这个被动连接开放可以监听端口
也就是已经开放被动的等待连接了
那就是当有连接进来的时候
我要把它接收过来
我把他接收过了
这两个那都是数据接收一个
那是有面向连接的接收
那是面向无连接的接收
你可以简单的认为
接收TCP的数据
UDP的数据
也就正好相对应
那就是发送TCP数据
就是发送UDP数据对吧
还有close怎么关闭
这东西需要注意点
就在unix和linux
它可以替代receive
它内部使用的创建的方式是在同一个文件描述符表里面
同样的就是
他们在
读取数据的时候读写数据的时候
他们也是调用相同的内核函数实现的
所以这两个来我们可以互相
就是混用
但是呢
这个socket的不能就是用open来替代
因为open第一次打开的是一个文件
而socket呢
他是一个网络套接字
所以那这两个有点差异
所以就是socket的是一个特殊的
就是相对于普通的文件
它是特殊主要特殊的
主要特点是特殊在他创建的数据结构
内部的数据结构有点不一样
文件描述符的属性也不一样
但是它读取数据
他都是从缓存里面读写数据
他这个逻辑上是一样
恩那我们具体来看一下这些socket
就这个函数哈就是第一个
那就是socket的函数
socket的函数
它有三个参数
一个就是
恩domain的一般来讲
它是指域的类型
你要指明使用的协议栈
对于那个
我们网络编程
互联网编程的话
他就是
他是需要指明服务的类型
你是面向连接的
还是面向无连接的
是流服务对吧
那么我们家一般来讲就是UDP使用
一般取零
他是要主动发起连接
主动发连接
他是像远程服务逐步建立链接
这里边呢
他有几个就是参数
第一个那是sockfd也就是套接字描述符也就是我们socket创建成功之后返回的那个数值也就是也就是那个文件描述符表里面的编号下标编号
第二个那是sock
你要连接的地址和端口号
这个sock addr他要指明他的地址和端口
但这地方的因为sock是一个相对通用的接口
所以呢
我们定义这个sock addr的时候呢
可以用
而这种方式来给他指明IP地址和端口
但是我们在传参数的时候
我们需要发的强制类型转换成这个通用的 这么一个就是这么一个类型的吧
尽管这个这个就是指针指向的
这个数据类型的是sock addr
这个传进去的
这个指针指向的那块数据对吧
他有多长
我们还需要指定它的长度
地址的长度
bind
就是绑定他是为套接字
指明一个本地端口地址
嗯就是这地方的使用就是sockaddr_in的结构了
它包含IP地址和端口号
服务器使用
它来指明熟知的端口号
然后等待连接
也就是说
比如说我们创建一个
web server
那我们这地方
他就要把本机的IP地址和80端口
绑定
那么这地方我们看sockaddr
他这类型的,发现他还是sockaddr
也觉得他是一个通用的类型
但我们实际定义的呢
是sockaddr_in
还有它的长度
也就是说
绑定的时候
恩开启需要知道本机的地址套接字描述符这个都是一样的
也就是我们前面socket创建的套接字描述符
我们这边有一个范例
就是sockaddr
然后呢
我们这地方有一个addr
他是sockaddr_in
这种数据结构
结构体变量
这种结构体变量
我们强制类型转换一下
我们把addr长度size of
他主要是就是面向连接的服务
服务器使用它再加一个套接字
为被动模式并准备接收
传入连接用于服务器
就是指明某个套接字连接是被动的
也就说是只有TCP协议才用的
TCP的协议
哎呀
他就是来指明我这个套接字
我开始监听了
我监听的长度就是
这地方有两个参数
一个是套接字
描述符一个
那是他的input
他的队列长度是指定在请求队列中允许的最大请求数
你说我同时允许有多少个请求进来啊
这个在安全上有一定考虑
也就是说
哎就是你如果把它设的太大的话
恩可能会有一些好多,就把你的这个
服务
把你的缓存给占了很多
让你的机器很慢
对吧
你的服务就是变得迟缓
所以那我们在这呢
就是
在这呢
我们一般来讲的要定义一个长度合适的长度
accept的是
当有一个链接进来的时候
我们需要把它从缓存里面拿出来就是帮他接收出来
接收出来就是获取传入连接的请求
返回新连接的套接字描述符
也就是说在服务端呢
他为每一个客户都会创建一个新的socket描述符这样呢
也就是客户端和服务端就可以一对一的通信
但是服务器他在监听的时候有一个套接字描述符对吧
他有一个监听套
接字描述符
然后呢
每连接进来一个
客户端他都会创建一个新的套接字描述符
所以那他就是
当前服务器有多少个客户端同时在线那么
他就有
多少个套接字描述符
再加上一个监听套接字描述符
它要占用那么多
他占用那么多套接字描述他在就是监听
就是接受这个新的链接的时候呢
他同时也罢
这个
客户端的IP地址和端口号也和他接收过了
所以我们这地方有一个void *
这个就是指针对吧
这个指针也就是我们接收到的这个参数
addr就是客户端的
就像我们寄信寄出去
而对方知道了你的地址
对吧你的地址
也就是说这个呢
accept
相当于我接收到了客户发来的信
那么我也在这个信上就可以看到客户端的地址
当然还包括地址
长度
就是发送数据
这个发送数据呢
因为它是面向无连接的
它是UDP的数据
所以呢
他这个发送数据的时候呢
他还要指明我这个数据要发向哪里
发现哪里有指明服务器的地址要注明
因为就是他是无连接的吗
底层他不维护你
你具体是要发向哪里
所以来这地方还需要指明这个地址和地址长度啊
发目的地
但是这地方还有这个数据
你要发的数据和数据的长度对吧
恩还有一个flag
我看这个他这几个参数和socket数据,数据长度就是还有一个标志
这个我们一些特殊情况下会用到
可以可以查阅参考资料
然后呢就是目的地
我发送数据的目的地
IP地址端口号还有个地址长度
但是就在这地方
有一点不同的
因为他就是我是面向连接的请求
所以那我在前面有了一个
他们互相之间已经建立了一个一对一的通信流服务
通信管道,所以呢
他在发送的时候呢
他只有需要指明数据和数据长度
增加一个flag
因为这个socket本身就是socket描述符本身
他就包含了他就是要连接的建立连接的对方的地址和端口号
对吧就已经包含了
所以但这地方在参数中
那就不需要特别指明了
他是
正好
正好对应
也就是说它是接收
UDP的数据
接收UDP数据呢
他就是提供一个缓冲
我要把数据存到哪里去吧
buffer
我最大能够接受多长的数据
对吧
然后呢
flag
嗯
然后呢
还有一个我接收的
这个数据是来自哪里
而他的地址和端口号大概还有他的地址
长度吧
比如说他是我接到数据了
我要知道数据从哪儿来的
这样的我再回信
对吧
给他回信
我收到信了
我要给他回信了
我要按
他的寄信地址
我再给她回信
这个那就是
但是这个就是
那正好是他是面向连接的
他正好
他也接受数据
但是呢
他不需要把接收的写数据的这个发送数据的那一端的地址给记录下来
因为他是已经建了一个连接
互相之间是知道了
建了一个一对一的管道对吧
所以这地方它只需要指明我接收的,一个就是缓冲对吧
一个内存块我我要先分配好
把接入的数据放进来的
close
那就是撤销掉套接字
如果就是只有一个进程
是使用了
就立即终止连接
并撤销该套接字
如果多个进程共享
该套接字
那么就让引用数-1
如果引用数降到零就撤销他
也就是说这个close
我们在多线程编程的时候会在
多个进程共享
同一个套接字对吧
所以他这地方套接字的时候close的时候
他的状态会复杂一点
后面我们讲TCP协议的时候
这里面呢
就是在套接字编程里面的还会用到一些常用的转换函数
比如说我们IP地址的吧
我们都是输一个
就是点分十进制的一个数就是以一个字符串来
表示这个IP地址
但是我们要转换成存储的格式呢
往往都是32位的
就是32位的一个数据来表示
一个IP地址不错
那我们这用点分十进制数表示的IP地址转换成网络字节序列的IP地址
然后呢
还有一个就是网络字节顺序转换成点分十进制的
IP地址对吧
还有字节排序函数来、
还有就是字节分大端和小端
哎就是不同的主机
他的方式不一样,网络字节顺序的都是什么
大段
所以
那就是在网络传输这些数据传输之前的我们需要把这个超过4个字节
两个字节四个字节的这个数据呢
我们要对他进行自己顺序的
调换如果你两台主机是同一台主机
但这些我们的实验中当然得用不到这些函数
因为他是传输过去两台主机是一样的啊
还有域名解析的相关函数
后面我们会专门介绍域名解析相关的东西
在这地方
大家了解一下
你说我们通过域名可以获得它的对应的IP地址
我们通过IP地址可以获得域名等等
哈
那我们具体来看一下这个
UDP socket的他们是怎么样建立连接的
他的就是这些socket的API函数
它的调用的顺序是什么样子
udp server
他是先创建一个socket
然后绑定地址和端口号
这样呢
他就可以开始接收了
UDP的客户端
他是一个主动连接的客户端
所以呢
他只要见了一个socket
然后他就可以send
因为send的里面包含了目的
地址和端口号
所以那他可以把他发送到某一个server
这个server收到数据之后
因为收到数据的时候
他也知道了客户端的
地址和端口
所以他可以回送回去
可以回信
这个是寄信
这边是回信对吧
这边回信
然后close
所以他的就是这个
函数调用的顺序还相对比较简单
而且中间不需要维护状态是吧
但是那个TCP的就比较复杂一点了
TCP的就比较复杂
与我们先看这个
先看这个tcp server
他是先创建一个套接字socket
然后要绑定地址和端口号
然后呢要监听
对吧
listen也就说
我被动打开服务
打开服务
这时侯呢也就就允许客户端连接进来了
对吧哎
只知道我每一次调用accept的时候
我就从
等待已经建立连接的等待
队列中
取一个客户端为他提供服务
对吧
所以这边呢
我们可以这么认为
就是就是TCP客户端的他是
是对应的
会返回一次
所以这两个
建立TCP连接的过程
我们再就是TCP内部来讲三次握手的过程
这样呢
他们就可以发送和接收数据了
对吧
但是一旦建立连接之后就是他就是一对一的
因为accept之后出来一个
也就是给这个客户分配了一个新的套接字描述符
所以呢
他们两个那是使用一对一的套接字描述符来进行通信的所以呢
我们这地方画了一个圈
把她这两个是专门为这一个TCP客户端服务的
那么同样的我如果多线程编程
或者是用其他的机制
哎呀
我accept了一个客户端
我就有一块服务
专门给他提供服务
我又accept的一个
我又专门为另一个这个TCP客户端服务
所以来这
它是面向连接的
字节流
他们互相可以收发
有两个字节流,一个是向这传的
一个是向这传的,两个字
节流
-课程内容简介
--Video
-网络协议基础
--Video
--Video
--Video
--Video
-上网浏览网页背后的网络通信过程
--Video
--Video
-实验环境安装配置
--Video
-网络相关命令
--Video
--Video
-本周作业
--外部链接
-编译、构建和调试
--Video
--Video
--Video
-Socket接口
--Video
--Video
-UDP范例代码
--Video
-TCP范例代码
--Video
-本周作业
--外部链接
-TCP协议概述
--Video
--Video
-Linux网络协议栈源代码简介
--Video
-Linux系统的编译、构建和调试
--Video
--Video
-TCP协议源代码分析
--Video
-本周作业
--外部链接
-IP协议基础
--Video
-路由表
--Video
-路由转发举例
--Video
-IP协议栈源代码解析
--Video
-路由协议简介
--Video
-网络层数据传输路径解析
--Video
-本周作业
--外部链接
-ARP协议基础
--Video
-ARP解析的过程
--Video
-ARP解析在网络传输过程中的作用
--Video
-ARP协议栈源代码解析
--Video
-本周作业
--外部链接
-以太网基础
--Video
--Video
-交换机的学习、转发和过滤数据库
--Video
-常见二层协议
--Video
-数据链路层在Linux网络协议栈中的一些关键代码分析
--Video
-本周作业
--外部链接
-DNS协议基础
--Video
-DNS域名的存储
--Video
-DNS域名解析过程分析
--Video
-本周作业
--外部链接
-互联网架构设计的最初动机与核心目标
--Video
-互联网架构设计的具体目标及背后重要权衡
--Video
--Video
--Video
-课程考核
--外部链接

