目录
基础知识之 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 | 传输协议 |
返回 | —— |
> = 0 | 成功,返回一个代表套接字描述符的整数 |
< 0 |