文章目录
socket
概念
负责不同网络上进程通信的接口,那么我们可以使用socket让不同主机上的进程可以通过套接字发送报文来进行通信。
在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,调用几个简单的接口就可以实现进程在网络中通信。
形式
<ip地址+协议+端口号>唯一标示网络中的一个进程。例如 TCP 用主机的 IP 地址 + 端口号作为 TCP 连接的端点,这个端点就叫做套接字。一个进程通过调用套接字接口,然后放入通过ip地址和端口号,将数据发送到另一端的对应端口号上。
类型
套接字主要有以下三种类型:
- 流套接字:流套接字基于 TCP 传输协议,由于 TCP 协议的特点,使用流套接字进行通信时能够保证数据无差错、无重复传送,并按顺序接收,通信双方不需要在程序中进行相应的处理。
- 数据报套接字:数据报套接字基于 UDP 传输协议,
- 原始套接字:当需要传送非传输层数据包(例如 Ping 命令时用的 ICMP 协议数据包)或者遇到操作系统无法处理的数据包时,此时就需要建立原始套接字来发送。
服务端和接收端使用socket流程
服务端:
- 创建套接字,
- 然后调用bind方法绑定进程端口。
- 然后调用listen方法监听,该方法是将该进程变为服务器进程。
- 然后调用accept方法,该方法会阻塞,最重要的一步是等待并接受客户的连接。
客户端:
- 创建套接字。
- 然后调用connect方法,connect方法和目的服务器建立三次握手连接。
- 然后建立连接完成就可以进行通信了。
使用send和recv方法来互相发送和接收数据。
read()/write()
recv()/send()
最后调用close方法来进行四次挥手关闭连接。