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
协议类型
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
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层
optnameSO_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 为关闭非阻塞。