基础知识之 BSD Socket
Socket 通常也称作"套接字",是支持 TCP/IP 协议的网络通信应用的基本操作单元,可以用来实现网间不同虚拟机或不同计算机之间的通信。使用TCP/IP协议的应用程序通过在客户端和服务器各自创建一个 Socket ,然后通过操作各自的 Socket 就可以完成客户端和服务器的连接以及数据传输的任务了。
Socket 的本质是编程接口( API ),是对 TCP/IP 的封装。使开发者不需要面对复杂的 TCP/IP 协议族,只需要调用几个较简单的 Socket API 就可以完成网络通信了。
RT-Thread 中的 SAL 抽象层 提供完整的 BSD Socket 相关 API。
BSD Socket 相关 API
名称
作用
socket
创建一个 socket 套接字
bind
将端口号和 IP 地址绑定带指定套接字上
listen
开始监听
accept
接受连接请求
connect
建立连接
send
面向连接的发送数据(tcp)
recv
面向连接的接收数据(tcp)
sendto
无连接的发送数据(udp)
recvfrom
无连接的接收数据(udp)
closesocket
关闭 socket
shutdown
按设置关闭套接字
gethostbyname
通过域名获取主机的 IP 地址等信息
getsockname
获取本地主机的信息
getpeername
获取连接的远程主机的信息
ioctlsocket
设置套接字控制模式
TCP/UDP
要学用套接字编程,一定要了解 TCP/UDP 协议。TCP/UDP 协议工作在 TPC/IP 协议栈的传输层,如下图所示:
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的协议,使用该协议时,可以保证客户端和服务端的连接是可靠和安全的。使用 TCP 协议进行通信之前,通信双方必须先建立连接,然后再进行数据传输,通信结束后终止连接。
优点:能保证可靠性、稳定性。
适用场景:TCP适合用于端到端的通信,适用于对可靠性要求较高的服务。
基于 TCP 的 socket 编程流程如下图所示:
UDP(User Datagram Protocol 用户数据报协议)是一种非面向连接的协议,它不能保证网络连接的可靠性。 客户端发送数据之前并不会去服务器建立连接,而是直接将数据打包发送出去。当服务器接收数据时它也不向发送方提供确认信息,如果出现丢失包或重份包的情况,也不会向发送方发出差错报文。
优点:控制选项少,无须建立连接,从而使得数据传输过程中的延迟小、数据传输效率高。
适用场景:UDP适合对可靠性不高,或网络质量有保障,或对实时性要求较高的应用程序。
基于 UDP 的 socket 编程流程如下图所示:
API 详解
socket
使用 socket 通信之前,通信双方都需要各自建立一个 socket。我们通过调用 socket 函数来创建一个 socket 套接字:
int socket(int domain, int type, int protocol)
函数参数
参数
描述
domain
协议域
type
类型
protocol
传输协议
返回