C++ 服务器 九 伯克利socket(一)

  之前我们讲解了TCP,和IP这两部分的内容其实还是很多的,我们只是讲了一部分跟我们开发服务器相关的一部分内容,他还有很多的细节。

  我们主要形成个概念:就是我们的IP是无连接的不可靠的,但是TCP是形成于IP无连接和不可靠的基础上所形成的的可靠的有链接的一种形式。

  今天我们讲的是socket的API,虽然我们最终服务器开发是调用封装好的,但是我们还是要做一定的了解,socket这个名词之前我已经进行过介绍了。

https://blog.csdn.net/Hanani_Jia/article/details/81458555 

  我们讲的API就是伯克利socket API,我们先来了解一下这一套API的历史。Berkeley sockets,也称为BSD Socket伯克利套接字的应用编程接口API)是采用C语言进程间通信,经常用在计算机网络间的通信。 BSD Socket的应用编程接口已经是网络套接字的事实上的抽象标准。大多数其他程序语言使用一种相似的编程接口。

BSD Socket作为一种API,允许不同主机或者同一个计算机上的不同进程之间的通信。它支持多种I/O设备和驱动,但是具体的实现是依赖操作系统的。这种接口对于TCP/IP是必不可少的,所以是互联网的基础技术之一。它最初是由加州伯克利大学为Unix系统开发出来的。所有现代的操作系统都都实现了伯克利套接字接口,因为它已经是连接互联网的标准接口了。这是对伯克利套接字的一个简单的介绍,大家有些了解就可以。

  之后是对头文件的介绍,这个API和我们正常编写程序是一样的,很多函数已经在库中被封装好了,我们直接使用头文件中的库就可以了。

  这里最主要的就是system下的socket.h这个头文件,这个头文件中定义了整套API的函数和数据结构的定义,之后我们会很详细的讲。之后在netinet/in.h中定义了IPV4和IPV6相关协议的信息类似一些宏定义一些define,还有arpa/inet.h这里主要是处理数字从操作系统字节序到网络的字节序,我们之前讲过我们网络之间用的是大端传输,而我们操作系统种可能是大端系统也可能是小端系统,如果我们的操作系统是大端他什么操作都不做会直接进行传输,但是如果我们的操作系统是小端的,他会将我们的信息转换成网络的大端再去进行传输。

  我们现在对这些API进行一个粗略的介绍。

第一个函数就是创建一个socket,他就相当于在在服务器或客户端中分配一个资源,来在内核中表示我们要建立一个socket。

 bind一般是由服务器端来使用的,绑定我们刚刚创建的socket到IP和端口,因为我们知道,服务器会打开一个监听端口,这个端口必须是一个固定的,客户端才能知道我们具体要联系到哪个端口,bind就是在做这样一个事情。

listen就是将我们刚刚bind的端口开始监听,监听客户端的链接。

Connect一般是由客户端来使用的,客户端就会连接到对应的服务器,对应的端口。

accept当listen后如果有对应的客户端链接来之后,并且完成了三次握手之后,accept会将这样客户端的socket返回回来。

 send、recv、write、read这些函数主要是用来客户端和服务器之间相互发送数据的函数,write和read在unix下是一个通用的函数,只要是打开的文件我们都可以write和read。

Close也算是一个万能的函数,因为在unix下有一句话叫做一切皆文件,是文件都可以关闭。

  

我们再看这几个API,这里的select和poll是用来处理多个socket链接的情况,比如说我们的服务器可能会有很多个客户端链接过来, 可能这个客户端让你读点信息,那个客户端又让你写点信息,那什么时候准备好了呢,就可以用select和poll。但是这两个数的效率比较低,所以使用它的并不多,一般各个操作系统都有自己的处理大量socket的函数。但是这两个函数是通用的,各个系统都可以使用,但是我们一般都采用对应系统下较为高效的处理的函数。

 之后两个函数分别是得到和设置,比如我们设置的对应的设置windows的大小,比如设置一些个选项,get就是获得去看看他的值是多少。

 这里我们只是对这些API有一个简单的了解,因为下次我们会用这些函数写一个简单的程序,因为我们最终编程是使用我们封装好的API进行的。

  

  

 

猜你喜欢

转载自blog.csdn.net/Hanani_Jia/article/details/81635718