当前课程知识点:互联网体系结构 >  第二周:Socket网络编程 >  Socket接口 >  Video

返回《互联网体系结构》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《互联网体系结构》慕课在线视频列表

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

-本周作业

--外部链接

第二周:Socket网络编程

-编译、构建和调试

--Video

--Video

--Video

-Socket接口

--Video

--Video

-UDP范例代码

--Video

-TCP范例代码

--Video

-本周作业

--外部链接

第三周:TCP协议与Linux内核

-TCP协议概述

--Video

--Video

-Linux网络协议栈源代码简介

--Video

-Linux系统的编译、构建和调试

--Video

--Video

-TCP协议源代码分析

--Video

-本周作业

--外部链接

第四周:IP协议及路由表

-IP协议基础

--Video

-路由表

--Video

-路由转发举例

--Video

-IP协议栈源代码解析

--Video

-路由协议简介

--Video

-网络层数据传输路径解析

--Video

-本周作业

--外部链接

第五周:ARP协议及ARP缓存

-ARP协议基础

--Video

-ARP解析的过程

--Video

-ARP解析在网络传输过程中的作用

--Video

-ARP协议栈源代码解析

--Video

-本周作业

--外部链接

第六周:二层交换网络及转发过滤数据库

-以太网基础

--Video

--Video

-交换机的学习、转发和过滤数据库

--Video

-常见二层协议

--Video

-数据链路层在Linux网络协议栈中的一些关键代码分析

--Video

-本周作业

--外部链接

第七周:DNS协议及域名存储与解析

-DNS协议基础

--Video

-DNS域名的存储

--Video

-DNS域名解析过程分析

--Video

-本周作业

--外部链接

第八周:互联网架构设计背后的渊源

-互联网架构设计的最初动机与核心目标

--Video

-互联网架构设计的具体目标及背后重要权衡

--Video

--Video

--Video

-课程考核

--外部链接

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。