API 接口介绍

SAL 组件抽象出标准 BSD Socket API 接口,如下是对常用网络接口的介绍:

创建套接字(socket)

int socket(int domain, int type, int protocol);

用于根据指定的地址族、数据类型和协议来分配一个套接字描述符及其所用的资源。

参数 描述
domain 协议族类型
type 协议类型
protocol 实际使用的运输层协议
返回 描述
>=0 成功,返回一个代表套接字描述符的整数
-1 失败

domain

协议族

  • PF_INET: IPv4
  • PF_INET6: IPv6
    type

协议类型

  • SOCK_STREAM: 流套接字
  • SOCK_DGRAM: 数据报套接字
  • SOCK_RAW: 原始套接字

    绑定套接字(bind)

int bind(int s, const struct sockaddr *name, socklen_t namelen);

用于将端口号和 IP 地址绑定带指定套接字上。当使用 socket() 创造一个套接字时, 只是给定了协议族,并没有分配地址,在套接字接收来自其他主机的连接前,必须用 bind() 给它绑定一个地址和端口号。

参数 描述
s 套接字描述符
name 指向 sockaddr 结构体的指针,代表要绑定的地址
namelen sockaddr结构体的长度
返回 描述
0 成功
-1 失败

监听套接字(listen)

int listen(int s, int backlog);

用于 TCP 服务器监听指定套接字连接。

参数 描述
s 套接字描述符
backlog 表示一次能够等待的最大连接数目
返回 描述
0 成功
-1 失败

接收连接(accept)

int accept(int s, struct sockaddr addr, socklen_t addrlen);

当应用程序监听来自其他主机的连接时,使用 accept() 函数初始化连接,accept() 为每个连接创立新的套接字并从监听队列中移除这个连接。

参数 描述
s 套接字描述符
addr 客户端设备地址信息
addrlen 客户端设备地址结构体的长度
返回 描述
0 成功,返回新创建的套接字描述符
-1 失败

建立连接(connect)

int connect(int s, const struct sockaddr *name, socklen_t namelen);

用于建立与指定 socket 的连接。

参数 描述
s 套接字描述符
name 服务器地址信息
namelen 服务器地址结构体的长度
返回 描述
0 成功,返回新创建的套接字描述符
-1 失败

TCP 数据发送(send)

int send(int s, const void *dataptr, size_t size, int flags);

发送数据,常用于 TCP 连接。

参数 描述
s 套接字描述符
dataptr 发送的数据指针
size 发送的数据长度
flags 标志,一般为0
返回 描述
>0 成功,返回发送的数据的长度
<=0 失败

TCP 数据接收(recv)

int recv(int s, void *mem, size_t len, int flags);

接收数据,常用于 TCP 连接。

参数 描述
s 套接字描述符
mem 接收的数据指针
len 接收的数据长度
flags 标志,一般为0
返回 描述
>0 成功,返回接收的数据的长度
=0 目标地址已传输完并关闭连接
<0 失败

UDP 数据发送(sendto)

int sendto(int s, const void dataptr, size_t size, int flags, const struct sockaddr to, socklen_t tolen);

发送数据,常用于UDP 连接。

参数 描述
s 套接字描述符
dataptr 发送的数据指针
size 发送的数据长度
flags 标志,一般为0
to 目标地址结构体指针
tolen 目标地址结构体长度
返回 描述
>0 成功,返回发送的数据的长度
<=0 失败

UDP 数据接收(recvfrom)

int recvfrom(int s, void mem, size_t len, int flags, struct sockaddr from, socklen_t *fromlen);

接收数据,常用于UDP 连接。

参数 描述
s 套接字描述符
mem 接收的数据指针
len 接收的数据长度
flags 标志,一般为0
from 接收地址结构体指针
fromlen 接收地址结构体长度
返回 描述
>0 成功,返回接收的数据的长度
=0 接收地址已传输完并关闭连接
<0 失败

关闭套接字(closesocket)

int closesocket(int s);

关闭连接,释放资源。

参数 描述
s 套接字描述符
返回 描述
0 成功
-1 失败

按设置关闭套接字(shutdown)

int shutdown(int s, int how);

提供更多的权限控制套接字的关闭过程。

参数 描述
s 套接字描述符
how 套接字控制的方式
返回 描述
0 成功
-1 失败

how

  • 0: 停止接收当前数据,并拒绝以后的数据接收;
  • 1: 停止发送数据,并丢弃未发送的数据;
  • 2: 停止接收和发送数据。

    设置套接字选项(setsockopt)

int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);

设置套接字模式,修改套接字配置选项。

参数 描述
s 套接字描述符
level 协议栈配置选项
optname 需要设置的选项名
optval 设置选项值的缓冲区地址
optlen 设置选项值的缓冲区长度
返回 描述
=0 成功
<0 失败

level

  • SOL_SOCKET:套接字层
  • IPPROTO_TCP:TCP层
  • IPPROTO_IP:IP层
    optname

  • SO_KEEPALIVE:设置保持连接选项

  • SO_RCVTIMEO:设置套接字数据接收超时
  • SO_SNDTIMEO:设置套接数据发送超时

    获取套接字选项(getsockopt)

int getsockopt(int s, int level, int optname, void optval, socklen_t optlen);

获取套接字配置选项。

参数 描述
s 套接字描述符
level 协议栈配置选项
optname 需要设置的选项名
optval 获取选项值的缓冲区地址
optlen 获取选项值的缓冲区长度地址
返回 描述
=0 成功
<0 失败

获取远端地址信息(getpeername)

int getpeername(int s, struct sockaddr name, socklen_t namelen);

获取与套接字相连的远端地址信息。

参数 描述
s 套接字描述符
name 接收信息的地址结构体指针
namelen 接收信息的地址结构体长度
返回 描述
=0 成功
<0 失败

获取本地地址信息(getsockname)

int getsockname(int s, struct sockaddr name, socklen_t namelen);

获取本地套接字地址信息。

参数 描述
s 套接字描述符
name 接收信息的地址结构体指针
namelen 接收信息的地址结构体长度
返回 描述
=0 成功
<0 失败

配置套接字参数(ioctlsocket)

int ioctlsocket(int s, long cmd, void *arg);

设置套接字控制模式。

参数 描述
s 套接字描述符
cmd 套接字操作命令
arg 操作命令所带参数
返回 描述
=0 成功
<0 失败

cmd

  • FIONBIO:开启或关闭套接字的非阻塞模式,arg 参数 1 为开启非阻塞,0 为关闭非阻塞。