soket编程

一。为什么要使用soket编程

进程之间通信的前提是需要能够唯一的标识一个进程。在本地通信可以使用PID唯一的标识一个进程。在网络中两个进程的冲突几率很大。

不过,网络层的ip地址可以唯一的标识一台主机,传输层的协议和端口号可以唯一的标识一台主机上的一个进程。

因此,ip地址+协议+端口号 就可以唯一的标识网络中的一个进程了。

唯一的标识一个进程之后,就可以利用soket通信了,soket被翻译成套接字,是应用层和传输层之间的一个抽象层。把一些TCP/IP的复杂的操作抽象为接口来实现网络中的通信。

二。soket的通信流程

socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现。客户端和服务器端各自维护一个“”文件“。

建立连接之后,可以读取对方的内容或者向自己的文件中写入内容供对方读取。

具体流程如下:

1.socket():根据IP地址的类型(ipv6或者iPv4),socket的类型,传输层的协议类型(TCP or UDP等)创建socket,但值得注意的是,此时该socket并没有一个具体的地址。

2.bind():给刚才已经创建好的socket赋值一个众所周知的具体的地址,(ip地址+端口号)。

注意:客户端和服务器端不同的是,服务器端是需要提前指定一个具体的地址的,而客户端就不会指定,是在connect()的时候自动由系统随机生成的一个

3.listen():在创建完socket(),bind()之后,就会调用listen()监听这个端口,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。

4。服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。

5。在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。

原文地址:https://www.cnblogs.com/lyr2015/p/7436112.html