setsockopt(设置socket状态)
相关函数 |
getsockopt |
表头文件 |
#include<sys/types.h> |
定义函数 |
int setsockopt(int s,int level,int optname,const void * optval,,socklen_toptlen); |
函数说明 |
setsockopt()用来设置参数s所指定的socket状态。参数level代表欲设置的网络层,一般设成SOL_SOCKET以存取socket层。参数optname代表欲设置的选项,有下列几种数值: |
参数 |
optval代表欲设置的值,参数optlen则为optval的长度。 |
返回值 |
成功则返回0,若有错误则返回-1,错误原因存于errno。 |
附加说明 |
EBADF 参数s并非合法的socket处理代码 |
设置 sctp时level为IPPROTO_SCTP,optname即为sctp套接字选项
这里只介绍SCTP_INITMSG选项:
本套接字选项用于获取或设置某个SCTP套接字在发送INIT消息时所用的默认初始参数。作为本选项的输入的是sctp_initmsg结构(即为setsockopt函数的第五个参数)。其定义如下:
struct sctp_initmsg{
uint16_t sinit_num_ostream;
uint16_t sinit_max_instream;
unit16_t sinit_max_attempts;
unit16_t sinit_max_init_timeo;
}
这些字段的含义如下:
sinit_num_ostream表示应用进程想要请求的外出sctp流的数目。该值要等到相应关联完成初始握手后才得到确认,而且可能因为对端的限制而向下协调。
sinit_max_instream表示应用进程准备允许的外来SCTP流的最大数目。如果该值大于SCTP协议栈支持的最大允许流数,那么它将被为这个最大数。
sinit_max_attempts表示SCTP协议栈应该重传多少次初始INIT消息才认为对端不可达。
sinit_max_init_timeo表示用于INIT定时器的最大RTO值。在初始定时器进行指数退避期间,该值将替代RTO.max作为重传RTO极限。该值以毫秒为单位。
注意:当设置这些字段时,SCTP将忽略其中的任何0值。一到多式套接字的用户在关联隐性建立期间也可能在辅助数据中传递一个sctp_initmsg结构。
SCTP 套接字接口
当 socket() 调用为 IPPROTO_SCTP 创建套接字时,它会调用特定于 SCTP 的套接字创建例程。针对 SCTP 套接字执行的套接字调用会自动调用相应的 SCTP 套接字例程。在一对一套接字中,每个套接字都对应一个 SCTP 关联。可以通过调用以下函数来创建一对一套接字:
socket(AF_INET[6], SOCK_STREAM, IPPROTO_STCP);
在一对多风格套接字中,每个套接字都处理多个 SCTP 关联。每个关联都具有一个名为 sctp_assoc_t 的关联标识符。可以通过调用以下函数来创建一对多套接字:
socket(AF_INET[6], SOCK_SEQPACKET, IPPROTO_STCP);
sctp_bindx()
int sctp_bindx(int sock, void *addrs, int addrcnt, int flags);
sctp_bindx() 函数管理 SCTP 套接字上的地址。如果 sock 参数为 IPv4 套接字,则传送给 sctp_bindx() 函数的地址必须为 IPv4 地址。如果 sock 参数为 IPv6 套接字,则传送给 sctp_bindx() 函数的地址可以为 IPv4 或 IPv6 地址。当传送给 sctp_bindx() 函数的地址为INADDR_ANY 或 IN6ADDR_ANY 时,此套接字将绑定到所有可用地址。可以使用 bind(3SOCKET) 绑定 SCTP 端点。
*addrs 参数的值是指向包含一个或多个套接字地址的数组的指针。每个地址都包含在其相应的结构中。如果地址为 IPv4 地址,则它们可以包含在sockaddr_in 结构或 sockaddr_in6 结构中。如果地址为 IPv6 地址,则它们可以包含在 sockaddr_in6 结构中。可以通过地址类型系列区分地址长度。调用方使用 addrcnt 参数指定数组中的地址数。
如果成功,则 sctp_bindx() 函数将返回 0。如果失败,则 sctp_bindx() 函数将返回 -1,并将 errno 的值设置为相应的错误代码。
如果没有为每个套接字地址提供同一端口,则 sctp_bindx() 函数将失败,并将 errno 的值设置为 EINVAL。
通过对以下零个或多个当前定义的标志执行按位 OR 运算,即可形成 flags 参数:
· SCTP_BINDX_ADD_ADDR
· SCTP_BINDX_REM_ADDR
SCTP_BINDX_ADD_ADDR 指示 SCTP 将给定地址添加到关联中。SCTP_BINDX_REM_ADDR 指示 SCTP 从关联中删除给定地址。这两个标志相互排斥。如果同时提供这两个标志,则 sctp_bindx() 将失败,并将 errno 的值设置为 EINVAL。
调用方无法删除关联中的所有地址。sctp_bindx() 函数拒绝此类尝试的表现为:函数失败并将 errno 的值设置为 EINVAL。应用程序可以在调用 bind() 函数之后使用 sctp_bindx(SCTP_BINDX_ADD_ADDR),将其他地址与端点关联。应用程序可以使用sctp_bindx(SCTP_BINDX_REM_ADDR) 删除与侦听套接字关联的地址。使用 sctp_bindx(SCTP_BINDX_REM_ADDR) 删除地址之后,接受新关联将不会重新关联已删除的地址。如果端点支持动态地址,则可以使用 SCTP_BINDX_REM_ADDR 或 SCTP_BINDX_ADD_ADDR 向对等方发送消息来更改对等方的地址列表。在已连接的关联中添加和删除地址为可选功能。不支持此功能的实现将返回 EOPNOTSUPP。
如果地址族不是 AF_INET 或 AF_INET6,则 sctp_bindx() 函数将失败并返回 EAFNOSUPPORT。如果 sock 参数中传递给 sctp_bindx() 的文件描述符无效,则 sctp_bindx() 函数将失败并返回 EBADF。
sctp_opt_info()
int sctp_opt_info(int sock, sctp_assoc_id_t id, int opt, void *arg, socklen_t *len);
sctp_opt_info() 函数将返回与