您现在的位置:首页 > 教案模板 > 正文

Linux SOCKET编程详解

2019-07-23 07:05 网络整理 教案网

linux socket函数参数_socket函数第三个参数_socket()函数

为了方便大家获取源代码,可以移步这里,GitHub源代码

打个比方,比如malloc,将如一个进程此时正在执行malloc分配堆空间,此时程序捕捉到信号发生中断,执行信号处理程序中恰好也有一个malloc,这样就会对进程的环境造成破坏,因为malloc通常为它所分配的存储区维护一个链接表,插入执行信号处理函数时,进程可能正在对这张表进行操作,而信号处理函数的调用刚好覆盖了进程的操作,造成错误。其方式是:一个进程通过系统调用kill(pid,sig)向同一用户的其它进程pid发送一个软中断信号:另一进程通过系统调用signal(sig,func)捕捉到信号sig后,执行予先约定的动作func,从而实现这两个进程间的通信。系统v ipc机制前面讨论的信号和管道虽然可以在进程之间通信。

由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量。ntopng是什么 ntopng是一个基于网页的高速通信分析器和流量收集器.ntopng基于ntop,它运行于所有unix平台.macos x和windows. 特性 从ntopng网站上,我们可以看到他们说它有众多的特性.这里列出了其中一些: 按各种协议对网络通信排序 显示网络通信和ipv4/v6的激活主机 持续不断以rrd格式存储定位主机的通信数据到磁盘 通过ndpi,ntop的dpi框架,发现应用协议 显示各种协议间的ip通信分布 分析ip通信,并根据源/目的地址进行排序 显示ip通信子网。我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用pid来唯一标示一个进程,但pid只在本地唯一,网络中的两个进程pid冲突几率很大,这时候我们需要另辟它径了,我们知道ip层的ip地址可以唯一标示主机,而tcp层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。

它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的ip地址,本地进程的协议端口,远地主机的ip地址,远地进程的协议端口。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用pid来唯一标示一个进程,但pid只在本地唯一,网络中的两个进程pid冲突几率很大,这时候我们需要另辟它径了,我们知道ip层的ip地址可以唯一标示主机,而tcp层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。

基本的思路是按照功能进行划分, 理解这些功能块之间的如何进行通信. 这些组件之间的通信通道就构成了各个组件的边界, 这些边界形式的描述为接口.接口并不是编程中的一个新的概念. 从我们的第一个 "helloworld" 程序开始我们就一直在不知不觉的使用它, 这里的接口就存在于我们的应用程序和打印程序之间. 应用程序使用 stdio 库提供的接口来把 "hello world" 字符串打印到屏幕上. xpcom 与 "helloworld" 程序的不同之处在于 xpcom 会在运行时刻找到这个屏幕打印的功能, 而 xpcom 事前根本就不需要在编译的时刻了解 stdio 库提供了什么东西.接口允许开发人员把功能的具体实现封装在组件内部, 而客户程序不需要了解这个功能是如何实现的, 它只需要使用它就行了.接口与按照契约编程一个接口在组件与客户程序之间达成契约. 并没有任何强制措施保证认同这个契约, 但是忽略它会是致命的. 在基于组件的编程中, 组件保证它提供的接口是不变的 - 不同版本的组件都要提供同样的访问方法 - 这就与使用它的客户程序达成了一种契约. 从这种角度来说, 基于组件的编程通常也称为按照契约编程.接口与封装组件边界之间的抽象对软件的可维护性与可重用性是致关重要的. 举个例子来说, 考虑下面一个没有很好封装的类. 在下面的例子中, 使用可自由访问的 public 的初始化方法可能会出问题.someclass类初始化class someclass{ public: // constructor someclass。传输层协议在osi上层模型中是低三层与高三层之间衔接的接口,为用户提供进程与进程之间的通信。人机接口层(mmi interface)是外部与蓝牙子系统进行通信的接口,这种通信使用专门的协议,外部mmi主机通过该协议发送命令到人机接口层,人机接口层解释收到的命令,继而控制应用层进行相应的动作,同时应用层也会将蓝牙子系统的数据、状态和事件送往人机接口层,人机接口层通过该协议发送命令到外部mmi主机。

usb协议(协议,请对比tcp/ip协议思考)中定义了4种传输机制:1控制传输(control),2块传输(buck),3中断传输(interrupt),4同步传输(isochronous)。接口名称连接网元接口功能描述主要协议s1-mmeenodeb - mme用于传送会话管理(sm)和移动性管理(mm)信息,即信令面或控制面信息s1-aps1-uenodeb - sgw在gw与enodeb设备间建立隧道,传送用户数据业务,即用户面数据gtp-ux2-cenodeb - enodeb基站间控制面信息x2-apx2-uenodeb - enodeb基站间用户面信息gtp-us3sgsn - mme在mme和sgsn设备间建立隧道,传送控制面信息gtpv2-cs4sgsn – sgw在s-gw和sgsn设备间建立隧道,传送用户面数据和控制面信息gtpv2-cgtp-us5sgw – pgw在gw设备间建立隧道,传送用户面数据和控制面信息(设备内部接口)gtpv2-cgtp-us6amme – hss完成用户位置信息的交换和用户签约信息的管理,传送控制面信息diameters8sgw – pgw漫游时,归属网络pgw和拜访网络sgw之间的接口,传送控制面和用户面数据gtpv2-cgtp-us9pcrf-pcrf控制面接口,传送qos规则和计费相关的信息diameters10mme - mme在mme设备间建立隧道,传送信令,组成mme pool,传送控制面数据gtpv2-cs11mme – sgw在mme和gw设备间建立隧道,传送控制面数据gtpv2-cs12rnc –sgw传送用户面数据,类似gn/gp sgsn控制下的utran与ggsn之间的iu-u/gn-u接口。在这一层定义了两个协议:一个是tcp协议(即传输控制协议,是个可靠的、面向连接的协议),它允许在internet上俩台主机间信息的无差错传输。

TCP/IP协议存在于OS中,网络服务通过OS提供,在OS中增加支持TCP/IP的系统调用——Berkeley套接字,如Socket,Connect,Send,Recv等

通过获取多期的遥感卫星影像数据,建立基于时空数据模型的遥感影像数据库,设计基于分布式多维时空数据存储模式,形成历史数据库、过程动态数据库和现势数据库等多层次存储体系,采用高并发和高性能计算技术建立时空数据精准化服务模型,并对外发布时空信息服务,用户可以获取任意区域的影像数据时空信息服务,推动了遥感影像数据服务由静态向动态转变[16],如图 4 所示.在农村土地整治项目建设过程中,利用时空数据精准化服务,可以获取项目区多时相影像数据,可以有效监管项目建设进展,如图 5 所示为项目实施前现场情况,如图 6 所示为项目整理成耕地之后的效果.。而mobilink数据同步的原理是,每个远程数据库都对应一个同步用户的,即每台笔记本都需要对应一个不同的同步用户。接口名称连接网元接口功能描述主要协议s1-mmeenodeb - mme用于传送会话管理(sm)和移动性管理(mm)信息,即信令面或控制面信息s1-aps1-uenodeb - sgw在gw与enodeb设备间建立隧道,传送用户数据业务,即用户面数据gtp-ux2-cenodeb - enodeb基站间控制面信息x2-apx2-uenodeb - enodeb基站间用户面信息gtp-us3sgsn - mme在mme和sgsn设备间建立隧道,传送控制面信息gtpv2-cs4sgsn – sgw在s-gw和sgsn设备间建立隧道,传送用户面数据和控制面信息gtpv2-cgtp-us5sgw – pgw在gw设备间建立隧道,传送用户面数据和控制面信息(设备内部接口)gtpv2-cgtp-us6amme – hss完成用户位置信息的交换和用户签约信息的管理,传送控制面信息diameters8sgw – pgw漫游时,归属网络pgw和拜访网络sgw之间的接口,传送控制面和用户面数据gtpv2-cgtp-us9pcrf-pcrf控制面接口,传送qos规则和计费相关的信息diameters10mme - mme在mme设备间建立隧道,传送信令,组成mme pool,传送控制面数据gtpv2-cs11mme – sgw在mme和gw设备间建立隧道,传送控制面数据gtpv2-cs12rnc –sgw传送用户面数据,类似gn/gp sgsn控制下的utran与ggsn之间的iu-u/gn-u接口。

网络传输协议概貌

Socket是应用层与TCP/IP协议族通信的中间软件抽象层

1、 socket套接字:

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现, socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭). 说白了Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

注意:其实socket也没有层的概念,它只是一个facade设计模式的应用,让编程变的更简单。是一个软件抽象层。在网络编程中,我们大量用的都是通过socket实现的。

2、套接字描述符

其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr

套接字API最初是作为UNIX操作系统的一部分而开发的,所以套接字API与系统的其他I/O设备集成在一起。特别是,当应用程序要为因特网通信而创建一个套接字(socket)时,操作系统就返回一个小整数作为描述符(descriptor)来标识这个套接字。然后,应用程序以该描述符作为传递参数,通过调用函数来完成某种操作(例如通过网络传送数据或接收输入的数据)。

在许多操作系统中,套接字描述符和其他I/O描述符是集成在一起的,所以应用程序可以对文件进行套接字I/O或I/O读/写操作。

当应用程序要创建一个套接字时,操作系统就返回一个小整数作为描述符,应用程序则使用这个描述符来引用该套接字需要I/O请求的应用程序请求操作系统打开一个文件。操作系统就创建一个文件描述符提供给应用程序访问文件。从应用程序的角度看,文件描述符是一个整数,应用程序可以用它来读写文件。下图显示,操作系统如何把文件描述符实现为一个指针数组,这些指针指向内部数据结构。

对于每个程序系统都有一张单独的表。精确地讲,系统为每个运行的进程维护一张单独的文件描述符表。当进程打开一个文件时,系统把一个指向此文件内部数据结构的指针写入文件描述符表,并把该表的索引值返回给调用者 。应用程序只需记住这个描述符,并在以后操作该文件时使用它。操作系统把该描述符作为索引访问进程描述符表,通过指针找到保存该文件所有的信息的数据结构。