socket基础

我们日常网络应用,比如打开一个浏览器,打开QQ打开微信和好友聊天的时候。我们的本地应用是如何和web服务器通信的呢?

首先在本地计算机我们通过PID进程来标识一个应用软件,例如Windows的任务管理器唯一一个标识来代表一个应用软件。但是在网络中PID就行不通了。

网络间有osi七层模型,我们要了解的是他们之间是如何“沟通”的呢?网络层上的IP地址或者是mac地址可以来标识一台网络中的主机,传输层的协议和端口号来标识具体一个对网络来说的具体的一个应用。比如一个办公室A电脑需要访问B电脑上的一个应用,首先A电脑得自己具备一个IP地址,然后获取B电脑的IP地址,两者之间进行IP地址和子网掩码的二进制换算(后面会提到为什么说这个)之后判断是否在同一个子网下面,然后如果是同一个子网也就是说A电脑可以访问到B电脑,那具体的应用进程就是用端口号来标识,而两应用进程之间的交互我们约定好一个协议,这样我们就可以利用这三个条件来进行网络之间的应用交互了。

我们日常几乎所有的网络通信都是运用TCP/IP协议的socket编程接口来实现的,也叫unix BSD套接字。

我们不需要了解TCP/IP协议是如何运行的概念,因为socket就是遵守这个协议的。

一. socket函数三个参数

1.协议域

常用的两个有AF_INET代表ipv4地址    AF_INET6代表ipv6地址 还有一个AF_UNIX因为只限于unix系统之间使用不常用所以无所谓

2.socket类型

SOCK_STREAM流文件数据类型,常用的也就这个,其他暂时不做了解

3.指定协议

IPPROTO_TCP    IPPROTO_UDP一个代表TCP一个代表UDP

二.bind()函数

例如(以下就以TCP为例子)当我们调用socket创建一个TCP的socket的时候就需要使用到bind()函数把计算机中的一个IP地址和端口号用AF_INET绑定给socket,否则接下来调用connect()  listen()函数就会自动随机分配。当然这仅仅对于服务端来说,客户端不需要。

而且我们要把这个主机字节符转换为网络字节符,因为网络中的数据只会认二进制

三.listen(). connect()函数 accept()函数 close()函数

作为服务端,调用socket() bind()之后就需要调用listen()函数来监听这个创建的socket,如果客户端使用connect()发送请求过来。服务端一旦监听到请求就会调用accept()函数来建立连接。连接建立好之后我们就可以像本地电脑系统中普通文件的I/O读写一样使用read() write()函数进行读写。连接结束之后我们客户端再使用close()函数向服务端发送终止连接请求然后关闭连接。

ps:以上的所有描述其实就是TCP协议的三次握手建立连接的过程和读写过程和四次握手的释放连接过程

具体概念就需要了解一下TCP协议的运作图了。

--------未完待续

猜你喜欢

转载自blog.csdn.net/crazyjgg7/article/details/81090488
今日推荐