读书人

linux c学习札记-SCTP基础客户/服务编

发布时间: 2013-01-17 10:28:54 作者: rapoo

linux c学习笔记----SCTP基础客户/服务编程(setsockopt,sctp_sendmsg等)

在编程之前先了解一下sctp套接字选项

?

setsockopt(设置socket状态)

?

相关函数 getsockopt
表头文件 #include<sys/types.h>
#include<sys/socket.h>
定义函数 int setsockopt(int s,int level,int optname,const void * optval,,socklen_toptlen);
函数说明 setsockopt()用来设置参数s所指定的socket状态。参数level代表欲设置的网络层,一般设成SOL_SOCKET以存取socket层。参数optname代表欲设置的选项,有下列几种数值:
SO_DEBUG 打开或关闭排错模式
SO_REUSEADDR 允许在bind()过程中本地地址可重复使用
SO_TYPE 返回socket形态。
SO_ERROR 返回socket已发生的错误原因
SO_DONTROUTE 送出的数据包不要利用路由设备来传输。
SO_BROADCAST 使用广播方式传送
SO_SNDBUF 设置送出的暂存区大小
SO_RCVBUF 设置接收的暂存区大小
SO_KEEPALIVE 定期确定连线是否已终止。
SO_OOBINLINE 当接收到OOB 数据时会马上送至标准输入设备
SO_LINGER 确保数据安全且可靠的传送出去。
参数 optval代表欲设置的值,参数optlen则为optval的长度。
返回值 成功则返回0,若有错误则返回-1,错误原因存于errno。
附加说明 EBADF 参数s并非合法的socket处理代码
ENOTSOCK 参数s为一文件描述词,非socket
ENOPROTOOPT 参数optname指定的选项不正确。
EFAULT 参数optval指针指向无法存取的内存空间。

设置 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?参数:

读书人网 >编程

热点推荐